R将数据集转换为第二个(匹配)数据集的列
在R中有两个数据集,我试图将第一个数据集的值添加到第二个数据集的一列中。这两个数据集有匹配的变量,应根据这些变量构造新列 第一个数据集如下所示:R将数据集转换为第二个(匹配)数据集的列,r,R,在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
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”不遵循逻辑顺序)
因此,我的想法是,脚本应该从第二个数据集中“读取”变量“实验”“主题”和“R”,并将第一个数据集中(例如,实验1,主题1,R3)的相应值粘贴到“NewColumn”列中。非常感谢您迄今为止的所有投入
非常感谢关于如何解决此问题的任何建议。我们可以使用
tidyr
中的gather
将第一个数据集(“df1”)的格式从“宽”改为“长”。我们从R1:R4列创建key/val列('Var','NewCol')。然后我们使用extract
将“Var”列拆分为两个新列(“V1”、“R”),left\u join
通过指定公共列与“df2”,并选择输出中需要的列
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我们可以使用gather
fromtidyr
将第一个数据集(“df1”)的格式从“宽”改为“长”。我们从R1:R4列创建key/val列('Var','NewCol')。然后我们使用extract
将“Var”列拆分为两个新列(“V1”、“R”),left\u join
通过指定公共列与“df2”,并选择输出中需要的列
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可能是这样
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
库(重塑)
df-df
实验对象R1 R2 R3 R4
1 1 1 28 29 59 55
2 1 3 27 24 50 50
dfc
实验对象变量值
1 R1 28
2 1 3 R1 27
3 1 R2 29
4 1 3 R2 24
51R359
613R350
71R455
8 1 3 R4 50
也许是这样
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
库(重塑)
df-df
实验对象R1 R2 R3 R4
1 1 1 28 29 59 55
2 1 3 27 24 50 50
dfc
实验对象变量值
1 R1 28
2 1 3 R1 27
3 1 R2 29
4 1 3 R2 24
51R359
613R350
71R455
8 1 3 R4 50
您想要的输出是什么。另外,您是否查看了合并
或匹配
?新列应为'59 59 55 55 28。。。因此,基于第一个数据集的受试者1/实验1的R1-4变量。我已经研究过合并,还没有研究过匹配,现在我会这么做。谢谢。如果我理解正确,使用tidyr
/dplyr
的解决方案可以是gather(df,R,NewColumn,R1:R4)%%>%mutate(R=as.numeric(sub(“^R”),R))
像@docendodiscimus一样,看起来根本不需要第二个数据集。在更改变量名后,它的效果非常好。我认为left_join函数主要是我想要的。非常感谢。你想要的产量是多少。另外,您是否查看了合并
或匹配
?新列应为'59 59 55 55 28。。。因此,基于第一个数据集的受试者1/实验1的R1-4变量。我已经研究过合并,还没有研究过匹配,现在我会这么做。谢谢。如果我理解正确,使用tidyr
/dplyr
的解决方案可以是gather(df,R,NewColumn,R1:R4)%%>%mutate(R=as.numeric(sub(“^R”),R))
像@docendodiscimus一样,看起来根本不需要第二个数据集。在更改变量名后,它的效果非常好。我认为left_join函数主要是我想要的。非常感谢。谢谢你的建议,但这不是我想要的。我在原来的问题中添加了一个编辑(目前正在尝试下面发布的akrun的建议)。谢谢你的建议,但这并不是我想要的。我对我的原始问题进行了编辑(目前正在尝试下面发布的akrun的建议)。