我想将三次重复的结果分成三个可能的副本。
如果初始设置为
A B C
1 122 106 114
2 110 122 110
我想将其转换为
A B
1 122 106
2 122 114
3 106 114
4 110 122
5 110 110
6 122 110
combn函数将逐行完成,但我无法弄清楚如何在整个数据帧中应用它(这可能非常大,我只使用两行进行演示。)。
答案 0 :(得分:2)
您可以执行以下操作:
lapply()
为数据的每一行应用combn
rbind
合并结果do.call
的魔力来组合步骤1和2创建的列表。在一行代码中:
do.call(rbind, lapply(seq(nrow(dat)), function(i)t(combn(dat[i, ], 2))))
[,1] [,2]
[1,] 122 106
[2,] 122 114
[3,] 106 114
[4,] 110 122
[5,] 110 110
[6,] 122 110
答案 1 :(得分:2)
这是另一种方法。我将使用data.table
来说明这个概念。但是使用data.frames也应该相当简单。
require(data.table) ## 1.9.2+
require(reshape2) ## for melt generic
setDT(dat)
r1 = melt(dat, id="A", value.name="B")[, variable := NULL]
rbindlist(list(r1, dat[, list(B,C)]))
# A B
# 1: 122 106
# 2: 110 122
# 3: 122 114
# 4: 110 110
# 5: 106 114
# 6: 122 110
答案 2 :(得分:1)
您可以迭代combn
返回的所有组合,而不是按照Andrie的建议迭代所有行:
d <- read.table(text="A B C
1 122 106 114
2 110 122 110")
l <- apply(combn(3, 2), 2, function(x) setNames(d[x], c("A", "B")))
do.call(rbind, l)
## A B
## 1 122 106
## 2 110 122
## 11 122 114
## 21 110 110
## 12 106 114
## 22 122 110
这可能比迭代所有行更快。 apply
中使用的函数返回当前感兴趣的d
列,并重新分配列名。检查l
,看看幕后发生了什么。