【问题标题】:Join each row with each other row [duplicate]将每一行与其他行连接起来[重复]
【发布时间】:2019-05-13 07:44:18
【问题描述】:

假设我们有一个简单的数据表:

d <- data.table(a=c(1,2,3),b=c("A","B","C"))

它的内容是:

   a b
1: 1 A
2: 2 B
3: 3 C

现在,我想将数据表的每一行与其他行连接/合并。结果应如下所示:

   a b c d
1: 1 A 1 A
2: 1 A 2 B
3: 1 A 3 C
4: 2 B 1 A
5: 2 B 2 B
6: 2 B 3 C
7: 3 C 1 A
8: 3 C 2 B
9: 3 C 3 C

所以,每一行基本上都与整个数据表绑定。 最有效的方法是什么?这可以仅使用 data.table 语法来完成吗?

谢谢!

编辑: data.table 的 CJ 方法确实构建了一个 cartesion 产品,但仅适用于向量,而不适用于表格。

【问题讨论】:

  • 合并是最有效的方式(笛卡尔积)
  • d[, .(c = d$a, d = d$b), by = .(a, b)]?
  • 你在寻找 data.tables 的交叉连接吗?如果是,请查看stackoverflow.com/a/27386618/1989480
  • @chinsoon12 OP 在问题的最后说CJ 没有给出想要的解决方案....
  • 另一个类似于 chinsoon 的被骗候选人:Jan 的 CJ.dt stackoverflow.com/a/27347397

标签: r join data.table


【解决方案1】:

三种可能的解决方案:

# one
d[, .(c = d$a, d = d$b), by = .(a, b)]

# two
d[, setnames(d, c("c","d")), by = .(a, b)]

# three
d[, setNames(as.list(d), c("c","d")), by = .(a, b)]

两者都给出:

   a b c d
1: 1 A 1 A
2: 1 A 2 B
3: 1 A 3 C
4: 2 B 1 A
5: 2 B 2 B
6: 2 B 3 C
7: 3 C 1 A
8: 3 C 2 B
9: 3 C 3 C

第二个选项也会改变原始data.tabled的列名。如果您不希望这样,则将第二个选项调整为:

d[, setnames(copy(d), c("c","d")), by = .(a, b)]

另外(包括我在bJust's answer 下的评论)您也可以使用merge,但仅在显式调用data.frame 方法时适用于data.table

merge.data.frame(d, d, by = NULL)

【讨论】:

  • 感谢您的回答。他们也是列数大的方便解决方案吗?
  • @Julian 在这种情况下,您可以使用解决方案二或三,例如:d[, setnames(copy(d), paste0(names(d),"_2")), by = .(a, b)]d[, setnames(copy(d), paste0("V",1:ncol(d))), by = .(a, b)]
【解决方案2】:

我使用 data.frame(如果可以的话)而不是 data.table 的幼稚解决方案:

merge(d,d,by=NULL)

by=NULL 确保获取所有组合

【讨论】:

  • 这不适用于data.table。在data.table 上,您应该显式调用数据框方法:merge.data.frame(d, d, by = NULL)
猜你喜欢
  • 2012-02-17
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多