我在R中有两个数据集,我试图将第一个数据集的值添加到第二个数据集的单个列中。这两个数据集具有匹配变量,基于这些变量,应构建新列。
第一个数据集如下所示:
Experiment Subject R1 R2 R3 R4
1 1 28 29 59 55
1 3 27 24 50 50
1 5 30 30 61 50
1 7 26 30 60 60
1 10 30 30 65 65
2 2 34 34 61 61
2 4 25 25 49 48
2 8 26 26 55 48
2 9 20 20 60 60
第二个数据集如下所示:
Subject Experiment R NewColumn
1 1 3
1 1 3
1 1 3
1 1 3
1 1 3
1 1 4
1 1 4
1 1 4
1 1 4
1 1 4
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 2
1 1 2
1 1 2
1 1 2
1 1 2
2 2 4
2 2 4
2 2 4
2 2 4
2 2 4
2 2 3
2 2 3
2 2 3
2 2 3
2 2 3
所以,基本上我正在尝试创建一个脚本或者使用一个函数将第一个数据集的R1-R4的值复制到第二个数据集的'NewColumn'中,假设实验,主题和R(1- 4)匹配。
我尝试使用循环和if语句创建解决方案,但遗憾的是没有成功。
修改
我想我应该补充说,第二个数据集包含(多个)更多变量(列,我在本例中省略了),很长(大约2000行)并且没有排序(实验,主题和'R'不遵循逻辑顺序。)
所以我的想法是,脚本应该从第二个数据集中“读取”变量'Experiment''Subject'和'R',并粘贴第一个数据集中的相应值(例如,实验1,主题1,R3 )进入'NewColumn'专栏。非常感谢你到目前为止所有的意见!
非常感谢任何有关如何解决这个问题的建议。
答案 0 :(得分:0)
我们可以使用gather
中的tidyr
来重塑第一个数据集(' df1')来自'范围'长期'格式。我们从R1:R4列创建键/ val列(' Var',' NewCol')。然后我们拆分了' Var'使用extract
,left_join
使用' df2'将列分为两个新列(' V1',' R')通过指定公共列,以及select
输出中所需的列。
library(dplyr)
library(tidyr)
gather(df1, Var, NewCol, R1:R4) %>%
extract(Var, into=c('V1', 'R'), '(.)(.)', convert=TRUE) %>%
left_join(df2, ., by=c('Subject', 'Experiment', 'R')) %>%
select(-V1)
# Subject Experiment R NewCol
#1 1 1 3 59
#2 1 1 3 59
#3 1 1 3 59
#4 1 1 3 59
#5 1 1 3 59
#6 1 1 4 55
#7 1 1 4 55
#8 1 1 4 55
#9 1 1 4 55
#10 1 1 4 55
#11 1 1 1 28
#12 1 1 1 28
#13 1 1 1 28
#14 1 1 1 28
#15 1 1 1 28
#16 1 1 2 29
#17 1 1 2 29
#18 1 1 2 29
#19 1 1 2 29
#20 1 1 2 29
#21 2 2 4 61
#22 2 2 4 61
#23 2 2 4 61
#24 2 2 4 61
#25 2 2 4 61
#26 2 2 3 61
#27 2 2 3 61
#28 2 2 3 61
#29 2 2 3 61
#30 2 2 3 61
df1 <- structure(list(Experiment = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), Subject = c(1L, 3L, 5L, 7L, 10L, 2L, 4L, 8L, 9L), R1 = c(28L,
27L, 30L, 26L, 30L, 34L, 25L, 26L, 20L), R2 = c(29L, 24L, 30L,
30L, 30L, 34L, 25L, 26L, 20L), R3 = c(59L, 50L, 61L, 60L, 65L,
61L, 49L, 55L, 60L), R4 = c(55L, 50L, 50L, 60L, 65L, 61L, 48L,
48L, 60L)), .Names = c("Experiment", "Subject", "R1", "R2", "R3",
"R4"), class = "data.frame", row.names = c(NA, -9L))
df2 <- structure(list(Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L), Experiment = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L), R = c(3L, 3L, 3L, 3L, 3L, 4L, 4L,
4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L,
4L, 4L, 3L, 3L, 3L, 3L, 3L)), .Names = c("Subject", "Experiment",
"R"), class = "data.frame", row.names = c(NA, -30L))
答案 1 :(得分:0)
也许是这样的?
library(reshape)
df<- data.frame(Experiment=c(1,1),Subject=c(1,3),R1=c(28,27),R2=c(29,24),R3=c(59,50),R4=c(55,50))
> df
Experiment Subject R1 R2 R3 R4
1 1 1 28 29 59 55
2 1 3 27 24 50 50
dfc <- melt(df,id=c("Experiment","Subject"))
dfc # New Data
> dfc
Experiment Subject variable value
1 1 1 R1 28
2 1 3 R1 27
3 1 1 R2 29
4 1 3 R2 24
5 1 1 R3 59
6 1 3 R3 50
7 1 1 R4 55
8 1 3 R4 50