【问题标题】:Joining data.table with by argument通过参数连接 data.table
【发布时间】:2016-04-01 06:38:56
【问题描述】:

我有两个 data.table dxdy

dx <- data.table(a = c(1,1,1,1,2,2), b = 3:8)
dy <- data.table(a = c(1,1,2), c = 7:9)

我想将dy加入dx的每一行,下面是想要的输出

data.table(plyr::ddply(dx, c("a", "b"), function(d) merge(d, dy, by = "a")))
    a b c
 1: 1 3 7
 2: 1 3 8
 3: 1 4 7
 4: 1 4 8
 5: 1 5 7
 6: 1 5 8
 7: 1 6 7
 8: 1 6 8
 9: 2 7 9
10: 2 8 9

但是,我无法仅使用[]data.tablemerge 内的操作进行输出?我累了

merge(dx, dy, by = "a", all = TRUE)

vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : 连接结果为 10 行;超过 9 = nrow(x)+nrow(i)。检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没问题,请尝试 by=.EACHI 为每个组运行 j 以避免大量分配。如果您确定要继续,请使用 allow.cartesian=TRUE 重新运行。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。

dy[dx,on="a"]

vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : 连接结果为 10 行;超过 9 = nrow(x)+nrow(i)。检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没问题,请尝试 by=.EACHI 为每个组运行 j 以避免大量分配。如果您确定要继续,请使用 allow.cartesian=TRUE 重新运行。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。

dx[, merge(dy, by = "a"), by = c("a", "b")]

is.data.table(y) 中的错误:缺少参数“y”,没有默认值

dx[, merge(.SD, dy, by = "a"), by = c("a", "b")]

merge.data.table(.SD, dy, by = "a") 中的错误: by 中列出的元素必须是 x 和 y 中的有效列名

我该怎么做呢?

谢谢!

【问题讨论】:

  • 试试dy[dx,on="a"]
  • @nicola 我已经修改了我的问题。
  • 很抱歉,但错误消息会告诉您确切的操作方法。 “如果您确定要继续,请使用 allow.cartesian=TRUE 重新运行”的哪一部分。你不明白吗?
  • 你是对的,我应该更仔细地阅读错误信息。

标签: r data.table


【解决方案1】:

因为多个1,错误来了。默认合并,即data.frames的实现,默认allow.cartesian=TRUE。但在 data.table 实现中,情况并非如此。因此,如果您运行以下代码,它将为您提供合并输出。

merge(dx, dy, by = "a", all = TRUE, allow.cartesian=TRUE)

上面的代码会给你你想要的输出。

【讨论】:

    【解决方案2】:

    如果,我正确理解了您的要求,您可以使用直接合并选项,

    dx <- data.table(a = c(1,1,2,2), b = 3:6)
    dy <- data.table(a = c(1,1,2), c = 7:9)
    merge(x = dx, y = dy, by = "a", all = TRUE)
    

    它提供了您提到的所需输出。 How to join (merge) data frames (inner, outer, left, right)?

    如果不是,我希望它能消除您的疑问,对不起。

    【讨论】:

    • 谢谢!但我刚刚修改了我的问题。
    • 试试这个命令希望它能解决你的问题 dx[dy, allow.cartesian = TRUE]
    猜你喜欢
    • 2020-12-17
    • 2020-08-31
    • 2021-04-22
    • 2018-04-19
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多