通过在 R 中相互减去列对来创建新列

Create new columns by substracting column pairs from each other in R

在心理学和相关学科中,我们经常有大量的变量名对,例如“_T1”或“_T3”表示时间点。

我想从每一行的附录“_T3”的列中减去附录“_T1”的列,根据每个变量为每一行(即参与者)创建一个新列(即差异分数)一对。

更喜欢 dplyr 解决方案,但一切顺利。

对于在我的第一个 post 中严重违反任何行为准则表示歉意。

使用 dplyrtidyr 的解决方案。

首先,让我们创建一个示例数据框。此数据框包含来自两个参与者 AB.

T1T3 数据
# Set the seed for reproducibility
set.seed(123)

# Create an example data frame
dt <- data.frame(ID = 1:10,
                 A_T1 = runif(10),
                 A_T3 = runif(10),
                 B_T1 = runif(10),
                 B_T3 = runif(10))
dt
#     ID      A_T1       A_T3      B_T1       B_T3
#  1   1 0.2875775 0.95683335 0.8895393 0.96302423
#  2   2 0.7883051 0.45333416 0.6928034 0.90229905
#  3   3 0.4089769 0.67757064 0.6405068 0.69070528
#  4   4 0.8830174 0.57263340 0.9942698 0.79546742
#  5   5 0.9404673 0.10292468 0.6557058 0.02461368
#  6   6 0.0455565 0.89982497 0.7085305 0.47779597
#  7   7 0.5281055 0.24608773 0.5440660 0.75845954
#  8   8 0.8924190 0.04205953 0.5941420 0.21640794
#  9   9 0.5514350 0.32792072 0.2891597 0.31818101
# 10  10 0.4566147 0.95450365 0.1471136 0.23162579

我们可以使用dplyrtidyr将数据帧从宽格式转换为长格式并执行操作。 DiffT1T3 之间的区别。

# Load packages
library(dplyr)
library(tidyr)

dt2 <- dt %>%
  gather(Column, Value, -ID) %>%
  separate(Column, into = c("Participant", "Group")) %>%
  spread(Group, Value) %>%
  mutate(Diff = T1 - T3)

dt2
#    ID Participant        T1         T3        Diff
# 1   1           A 0.2875775 0.95683335 -0.66925583
# 2   1           B 0.8895393 0.96302423 -0.07348492
# 3   2           A 0.7883051 0.45333416  0.33497098
# 4   2           B 0.6928034 0.90229905 -0.20949564
# 5   3           A 0.4089769 0.67757064 -0.26859371
# 6   3           B 0.6405068 0.69070528 -0.05019846
# 7   4           A 0.8830174 0.57263340  0.31038400
# 8   4           B 0.9942698 0.79546742  0.19880236
# 9   5           A 0.9404673 0.10292468  0.83754260
# 10  5           B 0.6557058 0.02461368  0.63109211
# 11  6           A 0.0455565 0.89982497 -0.85426847
# 12  6           B 0.7085305 0.47779597  0.23073450
# 13  7           A 0.5281055 0.24608773  0.28201775
# 14  7           B 0.5440660 0.75845954 -0.21439351
# 15  8           A 0.8924190 0.04205953  0.85035951
# 16  8           B 0.5941420 0.21640794  0.37773408
# 17  9           A 0.5514350 0.32792072  0.22351430
# 18  9           B 0.2891597 0.31818101 -0.02902127
# 19 10           A 0.4566147 0.95450365 -0.49788891
# 20 10           B 0.1471136 0.23162579 -0.08451214

如果想要原始格式,我们可以进一步spread数据框到原始格式。

dt3 <- dt2 %>%
  select(-starts_with("T")) %>%
  spread(Participant, Diff)

dt3
#    ID          A           B
# 1   1 -0.6692558 -0.07348492
# 2   2  0.3349710 -0.20949564
# 3   3 -0.2685937 -0.05019846
# 4   4  0.3103840  0.19880236
# 5   5  0.8375426  0.63109211
# 6   6 -0.8542685  0.23073450
# 7   7  0.2820178 -0.21439351
# 8   8  0.8503595  0.37773408
# 9   9  0.2235143 -0.02902127
# 10 10 -0.4978889 -0.08451214

假设所有数据都在数据帧 d 中,以下将变量存储在以 _diff 结尾的列中:

library(stringr)
t1_vars <- grep("_T1", colnames(d), value=TRUE)
t3_vars <- grep("_T3", colnames(d), value=TRUE)
d[, paste0(str_sub(t1_vars, end=-4), "_diff")] <- d[, t3_vars] - d[, t1_vars]