假设我们有一个简单的数据表:
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确实建立了笛卡尔乘积,但仅针对矢量,而非表格。
答案 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确保获得所有组合