分裂重复三次

时间:2014-08-20 10:36:31

标签: r combinations

我想将三次重复的结果分成三个可能的副本。

如果初始设置为

    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函数将逐行完成,但我无法弄清楚如何在整个数据帧中应用它(这可能非常大,我只使用两行进行演示。)。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  1. 使用lapply()为数据的每一行应用combn
  2. 使用rbind合并结果
  3. 利用do.call的魔力来组合步骤1和2创建的列表。
  4. 在一行代码中:

    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,看看幕后发生了什么。