根据向量检查列的每个元素

时间:2014-01-19 02:56:13

标签: r dataframe

我有两个数据帧。我需要针对第二个数据帧的每个元素检查一个数据中列的每个元素,并且当匹配时将第二个数据帧中不同列的内容复制回第一个数据帧中的另一个列。

以下是一些假数据:

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放在新列而不是值中。

2 个答案:

答案 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的灵感