将每一行彼此连接

时间:2019-05-13 07:44:18

标签: r join data.table

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

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-Method确实建立了笛卡尔乘积,但仅针对矢量,而非表格。

2 个答案:

答案 0 :(得分:5)

三种可能的解决方案:

# 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.table d的列名。如果您不想这样做,可以将第二个选项修改为:

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

此外(包括我在bJust's answer下的评论),您也可以使用merge,但是仅在显式调用data.table方法的data.frame上有效:< / p>

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

答案 1 :(得分:0)

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

merge(d,d,by=NULL)

by = NULL确保获得所有组合

相关问题