将数据从一个数据帧匹配到另一个数据帧

时间:2014-11-21 16:04:00

标签: r

首先,如果这个问题没有以最好的方式表达,我很抱歉,我是新手,但试图明确提出问题。我正在努力实现以下目标

我有两个数据框,我正在尝试从其中一个数据框中获取数据并将其添加到另一个数据库的新列中,我已经在下面创建了一个示例

IDa <- c(1,2,3)
score1a <- c(5,10,1)
score2a <- c(NA,8,NA)
score3a <- c(NA,NA,13)

dfa <- data.frame(IDa,score1a,score2a,score3a)

IDb <- c(1,1,1,2,2,3)
timeb <- c(1,2,3,2,3,3)

dfb <- data.frame(IDb,timeb)

得分1对应于时间1,得分2对应于时间2,得分3对应于时间3

我想要做的是将得分与适当的时间点匹配,找到相应的ID,并将其添加为dfb中的附加列

因此,dfb将有一个额外的列,其中包含5,NA,NA,8,NA,13

希望这是有道理的,感谢您对此的任何帮助!

编辑:我应该补充一点,因为你可以看到dfb中可用的时间点不一定有意义,例如在dfa的时间点1记录ID = 2的数据,但是dfb没有把它放在哪里(现在为ID = 2,timeb = 1的行,所以我需要尽可能用dfa中的数据填充dfb。

2 个答案:

答案 0 :(得分:2)

转换melt列后,您可以dfa longmerge表单,再dfb variable以匹配{{} 1}}。

timeb

或者将列名更改为,然后执行library(reshape2) merge(dfb,transform(melt(dfa, id.var='IDa', na.rm=TRUE), variable=as.numeric(factor(variable))), by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable'), all.x=TRUE) # IDb timeb value #1 1 1 5 #2 1 2 NA #3 1 3 NA #4 2 2 8 #5 2 3 NA #6 3 3 13

merge

答案 1 :(得分:2)

另一种选择是:

require(dplyr)
require(tidyr)

gather(dfa, Score, Val, -IDa) %>% 
  mutate(Score = as.numeric(gsub("[a-zA-Z]","",  Score))) %>% 
  left_join(dfb, ., by = c("IDb" = "IDa", "timeb" = "Score"))

#  IDb timeb Val
#1   1     1   5
#2   1     2  NA
#3   1     3  NA
#4   2     2   8
#5   2     3  NA
#6   3     3  13

这些步骤类似于akrun的答案,但使用了不同的功能。