【问题标题】:Merging data.tables using `on` fails [closed]使用`on`合并data.tables失败[关闭]
【发布时间】:2016-01-18 05:29:46
【问题描述】:

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

df2 具有称为 ActualOne 的唯一数字列。我想将 ActualOne 的所有值从 df2 附加到 df1,其中 df1 的 Product 和 Output 值与 df2 中的值联合匹配。对于 df2 中未找到的 Product、Output 对,ActualOne 由 NA 填充。

尝试 #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”填充

感谢您的帮助。

【问题讨论】:

标签: r merge data.table


【解决方案1】:

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

对于旧版本,惯用的二元连接 + 更新将首先是 key 和 data.tables,然后是连接/更新。类似的东西(我们没有要测试的实际数据):

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

【讨论】:

    【解决方案2】:

    这是一种方法:

    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)
    

    【讨论】:

      【解决方案3】:

      我想你想要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) 
      

      【讨论】:

        猜你喜欢
        • 2013-03-06
        • 2012-10-27
        • 1970-01-01
        • 2012-07-21
        • 2014-05-07
        • 2021-02-03
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多