首先,如果这个问题没有以最好的方式表达,我很抱歉,我是新手,但试图明确提出问题。我正在努力实现以下目标
我有两个数据框,我正在尝试从其中一个数据框中获取数据并将其添加到另一个数据库的新列中,我已经在下面创建了一个示例
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。
答案 0 :(得分:2)
转换melt
列后,您可以dfa
long
到merge
表单,再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的答案,但使用了不同的功能。