问题描述
假设我有2010年以来的10个变量: A_2010,B_2010,C_2010,...,A_A_2010等。
和2020年以来的10个变量: A_2020,B_2020,C_2020,...,A_A_2020等。
对于每个变量,我想找到2020和2010变量之间的差异。所以最后我想要10个变量: A_diff,B_diff,C_diff,...,A_A_diff等。
基本上就是A_2020 - A_2010
,B_2020 - B_2010
等。
如何使用dplyr
在R上执行此操作?我考虑过使用mutate_at
,但我认为我不能使用两个“集合”变量。我还考虑过使用mutate
,例如:
mutate(diff = vars(ends_with("_2020")) - vars(ends_with("_2010")))
但是显然这是行不通的,因为mutate仅使一个变量生效。另外,我只想要匹配对之间的差异,而不是交叉差异。
使用dplyr
进行此操作最简单的方法是什么?我也可以做一个功能。
解决方法
我创建的虚拟数据如下:
id A_2010 B_2010 C_2010 A_2020 B_2020 C_2020
1 1 -1.4106479 -0.41316193 0.671434592 0.431175305 0.9530425 -0.07645398
2 2 -0.4233896 -0.55844324 0.351625958 -0.835936648 -1.8954344 0.77046246
3 3 -1.1210037 -0.72905447 0.394883881 0.722913328 -0.1387928 -2.73316817
4 4 0.7292334 -0.27776558 0.618026393 -0.083015341 -0.2535384 -0.66328672
5 5 -0.1212647 -0.36964042 -0.126540747 -0.008974603 -0.3462768 0.21037482
6 6 0.5674501 0.03823422 -0.002472146 -1.013204719 0.1534576 0.46734696
7 7 0.8097872 1.29604921 1.116411440 0.243686906 0.4341491 0.66321482
8 8 -0.6830225 0.49210937 1.158570926 0.430689144 0.5482753 -0.87753792
9 9 -1.2455627 0.22572320 0.125511143 -1.280150826 -2.0216185 0.05846329
10 10 -0.4060474 -1.09270201 0.319908580 0.517562785 -2.0227615 -1.26608836
这是我认为您需要的代码:
library(dplyr)
library(tidyr)
df10 <- df %>% select(id,contains('2010')) %>% gather(key = 'Var10',value = 'Val2010',-id)
df20 <- df %>% select(id,contains('2020')) %>% gather(key = 'Var20',value = 'Val2020',-id)
dfAll <- cbind(df20,df10[,-1])
dfAll$diff <- dfAll$Val2020-dfAll$Val2010
这是最终结果:
> head(dfAll)
id Var20 Val2020 Var10 Val2010 diff
1 1 A_2020 0.431175305 A_2010 -1.4106479 1.8418232
2 2 A_2020 -0.835936648 A_2010 -0.4233896 -0.4125471
3 3 A_2020 0.722913328 A_2010 -1.1210037 1.8439171
4 4 A_2020 -0.083015341 A_2010 0.7292334 -0.8122487
5 5 A_2020 -0.008974603 A_2010 -0.1212647 0.1122901
6 6 A_2020 -1.013204719 A_2010 0.5674501 -1.5806548
,
您可以直接减去两组列。
#column names of 2010
var_2010 <- grep('2010',names(df),value = TRUE)
#column names of 2020
var_2020 <- grep('2020',value = TRUE)
#create new columns
new_col <- paste0('diff_',gsub('\\d|_','',var_2010))
#subtract
df[new_col] <- df[var_2020] - df[var_2010]