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

在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”不遵循逻辑顺序)

因此,我的想法是,脚本应该从第二个数据集中“读取”变量“实验”“主题”和“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
from
tidyr
将第一个数据集(“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的建议)。