为每组匹配对创建一个变量变量,mutate_at两组

问题描述

假设我有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_2010B_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]