迭代数据框中唯一的组合组合

时间:2012-07-24 10:03:52

标签: r iteration unique dataframe combinations

我在数据框中总结了3个不同的组。数据框如下所示:

d <- data.frame(v1 = c("A","A","A","B","B","B","C","C","C"), 

                v2 = c(1:9), stringsAsFactors = FALSE)

我想要的是将A的值与B的值进行比较.A的值与B的值以及最后的比较B的值与C的值

我构造了2个for循环来迭代v1来提取要比较的组。但是,for循环为我提供了所有可能的组合,如:

A vs. A

A vs. B

A vs. C

B vs. A

B vs. B

B vs. C

C vs. A等等......

这是我的for循环:

for(i in unique(d$v1)) {

    for(j in unique(d$v1)) {

        cat("i = ", i, "j = ", j, "\n")

        group1 <- d[which(d$v1 == i), ]

            group2 <- d[which(d$v1 == j), ]

        print(group1)
        print(group2)

        cat("---------------------\n\n")

    }
}

如何设法仅迭代数据帧d,以便在第一次迭代中group1包含A的值,group2包含B的值。在第二次迭代中,group1包含A和group2的值C的值。作为最后的比较,group1包含B的值,group2包含C的值。

我完全坚持这个问题并希望在这里找到答案。

干杯!

2 个答案:

答案 0 :(得分:4)

也许这样的事情对你有用。通过更多的工作,输出也可以“整理”一点。

我们将使用combn查找组合,并使用lapply根据组合对数据进行子集化:

temp = combn(unique(d$v1), 2)
temp
#     [,1] [,2] [,3]
# [1,] "A"  "A"  "B" 
# [2,] "B"  "C"  "C" 
lapply(1:ncol(temp), function(x) cbind(d[d$v1 == temp[1, x], ],
                                       d[d$v1 == temp[2, x], ]))
# [[1]]
#   v1 v2 v1 v2
# 1  A  1  B  4
# 2  A  2  B  5
# 3  A  3  B  6
# 
# [[2]]
#   v1 v2 v1 v2
# 1  A  1  C  7
# 2  A  2  C  8
# 3  A  3  C  9
# 
# [[3]]
#   v1 v2 v1 v2
# 4  B  4  C  7
# 5  B  5  C  8
# 6  B  6  C  9

答案 1 :(得分:2)

我个人喜欢mrdwab的优雅答案,但是如果你仍然想按照你的方式使用它来解决这个问题(考虑到这会弄乱你的代码,最好保持它的整洁: )

u <- unique(d$v1)
for (i in 1:length(u)) {
    if (i < length(u)) {
        for (j in u[(i+1):length(u)]) {
            group1 <- d[which(d$v1 == u[i]), ]
            group2 <- d[which(d$v1 == j), ]
            cat("i = ", u[i], "j = ", j, "\n")
            print(group1)
            print(group2)
            cat("---------------------\n\n")
        }
    }
}

结果如下:

i =  A j =  B 
  v1 v2
1  A  1
2  A  2
3  A  3
  v1 v2
4  B  4
5  B  5
6  B  6
---------------------

i =  A j =  C 
  v1 v2
1  A  1
2  A  2
3  A  3
  v1 v2
7  C  7
8  C  8
9  C  9
---------------------

i =  B j =  C 
  v1 v2
4  B  4
5  B  5
6  B  6
  v1 v2
7  C  7
8  C  8
9  C  9
---------------------