我有两个数据帧。我需要针对第二个数据帧的每个元素检查一个数据中列的每个元素,并且当匹配时将第二个数据帧中不同列的内容复制回第一个数据帧中的另一个列。
以下是一些假数据:
df1 <-data.frame(c("267119002","257051033",NA,"267098003","267099020","267047006"))
names(df1)[1]<-"ID"
df2 <-data.frame(c("257051033","267098003","267119002","267047006","267099020"))
names(df2)[1]<-"ID"
df2$vals <-c(11,22,33,44,55)
基本上我想要做的是ID
中的每个df1
,检查df2
中相应的匹配行,并将df2 $ vals的值复制回{{1 }}。合并实际上并不是一个选项,因为在真实数据中我需要为许多列重复这一点,而多次合并会导致df1
变得非常愚蠢。我需要保持精益! df1
可能包含df1
,在这种情况下,我想将NA
放在新列而不是值中。
答案 0 :(得分:2)
您可以使用match
:
df2[match(df1$ID,df2$ID),]
ID vals
3 267119002 33
1 257051033 11
NA <NA> NA
2 267098003 22
5 267099020 55
4 267047006 44
如果你想删除NA
:
df2[na.omit(match(df1$ID,df2$ID)),]
ID vals
3 267119002 33
1 257051033 11
2 267098003 22
5 267099020 55
4 267047006 44
答案 1 :(得分:0)
好的,感谢agstudy的回答,我能够自己解决这个问题。这正是我想要的!
fetcher <-function(x){
y <- df2$vals[which(match(df2$ID,x)==TRUE)]
return(y)
}
sapply(df1$ID,function(x) fetcher(x))
感谢agstudy的灵感