使用`on`合并data.tables失败

时间:2015-10-19 18:46:48

标签: r merge data.table

我有两个不同维度的数据框,称之为df1和df2。它们都有称为Product和Output的整数列。

df2具有名为ActualOne的唯一数字列。我想将ActualOne的所有值从df2追加到df1,其中df1的Product和Output值与df2中的值相关联。对于产品,输出对在df2中找不到,ActualOne由NAs填充。

尝试#1:使用data.table

library(data.table)
setDT(df1)
setDT(df2)

df1[df2, ActualOne := i.ActualOne, on=c("Product", "Output")]

我绝不是data.table的专家。我认为没有必要重新格式化,并认为临时存储为data.table更好。

我收到以下错误:

  

[.data.table(df1,df2,:=(ActualOne,i.ActualOne)中的错误,:      未使用的参数(on = c(“Product”,“Output”))

尝试#2:使用匹配功能

我的头顶上的东西:

df1$ActualOne <- df2[match(df1$Product,df2$Product) & match(df1$Output,df2$Output,"ActualOne"]

这导致df1的ActualOne列由“ActualOne”填充

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您有data.table的旧版本。如果您希望代码正常工作,则需要更新到 v1.9.6 + - 请查看更新here

对于旧版本,惯用二进制连接+更新将首先key两个data.table,然后加入/更新。像(我们没有实际数据要测试):

setkey(df1, Product, Output)
setkey(df2, Product, Output)
df1[df2, ActualOne := i.ActualOne]

答案 1 :(得分:0)

这是一种方法:

actualTF <- df1$Product == df2$Product & df1$Output == df2$Output
df1$ActualOne <- sapply(1:50, function(x) if (actualTF[x]) return(df2$ActualOne[x]) else NA)

答案 2 :(得分:0)

我想要merge()函数。以下是您的描述示例:

library(data.table)
df1 <- data.table(Product=1:10, Output=101:110)
df2 <- data.table(Product=1:3, Output=101:103, ActualOne=c('A', 'B', 'C'))
merge(df1, df2, by=c('Product', 'Output'), all.x=TRUE)