向量化R中2个数据帧列之间的匹配值

时间:2014-08-08 16:27:35

标签: r vectorization

这似乎很基本,所以如果这个问题得到解答我会道歉。我是自学成才,可能缺乏正确的词汇来找到答案。

我想将数据帧的一列中的值(我们称之为df1)输入另一个数据帧的多行(df2)。它们将与另一个Id列匹配。

所以,例如,

df1将是

   Id   didAThing
    1   TRUE
    2   TRUE
    3   FALSE
    4   FALSE
    5   TRUE

df2是

Id  didAThing
1   NA
1   NA
1   NA
2   NA
2   NA
2   NA
3   NA
3   NA
3   NA
4   NA
4   NA
4   NA
5   NA
5   NA
5   NA

,最终输出为

Id  didAThing
1   TRUE
1   TRUE
1   TRUE
2   TRUE
2   TRUE
2   TRUE
3   FALSE
3   FALSE
3   FALSE
4   FALSE
4   FALSE
4   FALSE
5   TRUE
5   TRUE
5   TRUE

我已经使用下面的循环创建了一个解决方案的工作示例。我希望能够对此进行矢量化,因为我的实际数据集非常大。

df1<-data.frame("Id"=c(rep(1:5)),"didAThing"=c(T,T,F,F,T))
df2<-data.frame("Id"=c(rep(1:5,each=3)),"didAThing"=NA)

for (i in 1:NROW(df2)) {
  df2[i,2]<-df1[df2[i,1],2]
  }

NAs也可能会出现在Id号码中,因此如果解决方案在这种情况下没有中断,那就太好了。如果您有任何建议,请提前致谢!

*编辑 感谢您的快速回复。我意识到我遗漏了这些列是更大数据框的一部分的重要细节,所以理想情况下我想在可能的情况下修改一列。

1 个答案:

答案 0 :(得分:2)

library(dplyr)
left_join(df2[,-2,drop=F],df1, by="Id")
#    Id didAThing
#1   1        TRUE
#2   1        TRUE
#3   1        TRUE
#4   2        TRUE
#5   2        TRUE
#6   2        TRUE
#7   3       FALSE
#8   3       FALSE
#9   3       FALSE
#10  4       FALSE
#11  4       FALSE
#12  4       FALSE
#13  5        TRUE
#14  5        TRUE
#15  5        TRUE

或使用data.table

 DT1 <- data.table(df1, key="Id")
 DT2 <- data.table(df2[,-2,drop=F], key="Id")
 DT2[DT1]

使用data.table的另一种方式:

 DT1 <- data.table(df1)
 DT2 <- data.table(df2, key="Id")
 DT2[DT1, didAThing := i.didAThing]

单独更新 DT2的{​​{1}}列,并通过引用更新,因此应该快速且内存效率高。 didAThing是引用i.didAthing DT1's列的快捷方式...由于您说自己拥有庞大的数据框架(未提及实际尺寸),因此您可以使用didAThing通过引用将data.frames转换为data.tables。那是;

setDT