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の値と比較します。

比較するグループを抽出するためにv1を反復処理する2つのforループを作成しました。ただし、forループは次のようなすべての可能な組み合わせを提供します。

A対A

A対B

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の値が含まれるように、データフレームのみを反復処理するにはどうすればよいですか。2番目の反復では、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

私は個人的にその優雅さのために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
---------------------
于 2012-07-24T10:44:26.163 に答える