这似乎很基本,所以如果这个问题得到解答我会道歉。我是自学成才,可能缺乏正确的词汇来找到答案。
我想将数据帧的一列中的值(我们称之为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号码中,因此如果解决方案在这种情况下没有中断,那就太好了。如果您有任何建议,请提前致谢!
*编辑 感谢您的快速回复。我意识到我遗漏了这些列是更大数据框的一部分的重要细节,所以理想情况下我想在可能的情况下修改一列。
答案 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