通过在 R 中相互减去列对来创建新列
Create new columns by substracting column pairs from each other in R
在心理学和相关学科中,我们经常有大量的变量名对,例如“_T1”或“_T3”表示时间点。
我想从每一行的附录“_T3”的列中减去附录“_T1”的列,根据每个变量为每一行(即参与者)创建一个新列(即差异分数)一对。
更喜欢 dplyr 解决方案,但一切顺利。
对于在我的第一个 post 中严重违反任何行为准则表示歉意。
使用 dplyr
和 tidyr
的解决方案。
首先,让我们创建一个示例数据框。此数据框包含来自两个参与者 A
和 B
.
的 T1
和 T3
数据
# 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
我们可以使用dplyr
和tidyr
将数据帧从宽格式转换为长格式并执行操作。 Diff
是 T1
和 T3
之间的区别。
# 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]
在心理学和相关学科中,我们经常有大量的变量名对,例如“_T1”或“_T3”表示时间点。
我想从每一行的附录“_T3”的列中减去附录“_T1”的列,根据每个变量为每一行(即参与者)创建一个新列(即差异分数)一对。
更喜欢 dplyr 解决方案,但一切顺利。
对于在我的第一个 post 中严重违反任何行为准则表示歉意。
使用 dplyr
和 tidyr
的解决方案。
首先,让我们创建一个示例数据框。此数据框包含来自两个参与者 A
和 B
.
T1
和 T3
数据
# 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
我们可以使用dplyr
和tidyr
将数据帧从宽格式转换为长格式并执行操作。 Diff
是 T1
和 T3
之间的区别。
# 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]