0

次のマトリックスについて考えてみます。

sequence <- structure(list(C1 = c(2L, 9L, 3L, 9L, 1L, 8L, 9L, 6L, 4L, 5L, 
3L, 2L), C2 = c(3L, 6L, 5L, 8L, 8L, 7L, 3L, 7L, 2L, 1L, 4L, 1L
), C3 = c(8L, 2L, 6L, 4L, 6L, 5L, 7L, 4L, 5L, 9L, 1L, 7L)), .Names = c("C1", 
"C2", "C3"), class = "data.frame", row.names = c(NA, -12L))

各行には3つの数字の組み合わせがあります。すべてのトライアドをペアに再結合しようとしています。各トライアド行は3つの行に分割されています(それぞれに可能なペアが含まれています)。たとえば、行1(2、3、8)は、行1(2、3)、行2(3、8)、および行3(2、8)に変換する必要があります。結果は次のようになります。

result <- structure(list(Col1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L), .Label = c("Row 1", "Row 2", "Row 3"), class = "factor"), 
    Col2 = c(2L, 3L, 2L, 9L, 6L, 9L, 3L, 5L, 3L), Col3 = c(3L, 
    8L, 8L, 6L, 2L, 2L, 5L, 6L, 6L)), .Names = c("Col1", "Col2", 
"Col3"), class = "data.frame", row.names = c(NA, -9L))

(テーブルは、すべての行が再結合されるまで繰り返されます)

私はcombn関数を使用してこれを実行しようとしましたt(combn(unlist(t(sequence)),2))が、これは、各行の要素のみを再結合するのではなく、マトリックスのすべての要素を再結合することです。光はありますか?

4

1 に答える 1

1

もっときれいな方法があると確信していますが、cbind を使用して目的のペアを 3 回取得し、rbind を使用してそれらをまとめることができます。

sequence <- structure(list(C1 = c(2L, 9L, 3L, 9L, 1L, 8L, 9L, 6L, 4L, 5L, 
3L, 2L), C2 = c(3L, 6L, 5L, 8L, 8L, 7L, 3L, 7L, 2L, 1L, 4L, 1L
), C3 = c(8L, 2L, 6L, 4L, 6L, 5L, 7L, 4L, 5L, 9L, 1L, 7L)), .Names = c("C1", 
"C2", "C3"), class = "data.frame", row.names = c(NA, -12L))

# Essentially what you wanted
temp.result <- with(sequence, rbind(cbind(C1, C2), cbind(C2, C3), cbind(C1, C3)))
# Identify which rows we're talking about
id <- rep(seq(nrow(sequence)), 3)
# Put it all together
result <- cbind(id, temp.result)
# Order it the way you imply in your question
result <- result[order(result[,1]),]
# Give it the colnames you want
colnames(result) <- c("Col1", "Col2", "Col3")
head(result)
#     Col1 Col2 Col3
#[1,]    1    2    3
#[2,]    1    3    8
#[3,]    1    2    8
#[4,]    2    9    6
#[5,]    2    6    2
#[6,]    2    9    2
于 2012-05-28T21:09:25.333 に答える