1

我在一个数据框中总结了 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与C

B 与 A

B 与 B

B 与 C

C与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 的值。

我不知何故完全被这个问题所困扰,并希望在这里找到答案。

干杯!

4

2 回答 2

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
于 2012-07-24T10:36:33.510 回答
2

I personally like mrdwab answer for its elegance, but if you still want to do it your way with the loops I'd fix it with this (take into account this will mess up your code, it's better to keep it tidy :)

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")
        }
    }
}

And result in this:

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
---------------------
于 2012-07-24T10:44:26.163 回答