1

私は次の問題の解決策を持っていますが、それはかなり醜く、おそらくもっと短い方法で行うことができます。お役に立てば幸いです。

私の入力は次のようになります。

C1     C2 
A      B     
B      D    
D      C 
A      D

私の出力は次のようになります。

A B C D
1 1 0 0
0 1 0 1
0 0 1 1  
1 0 0 1

私の現在の解決策は次のとおりです。

index <- unique(unlist(input[,1:2]))
output <- matrix(0,nrows=dim(input),ncols=length(index))
for(i in 1:dim(input)) {
    output[i, input[i,]$C1] <- 1
    output[i, input[i,]$C2] <- 1
}

もちろん、実際には 4 ~ 5 行で問題ありませんが、R の初心者でさえ、これはforループを使用するのに適切ではないと感じています。それに加えて、実際のデータには 3 つ以上の列があるため、最終的には見栄えがよくありません。どうすればよりスマートな方法でそれを行うことができますか?

乾杯

4

3 に答える 3

3

1 つの方法を次に示します。

library(plyr)
all.levels <- sort(levels(unlist(input)))
adply(input, 1, function(x)table(factor(unlist(x), all.levels)))
#   C1 C2 A B C D
# 1  A  B 1 1 0 0
# 2  B  D 0 1 0 1
# 3  D  C 0 0 1 1
# 4  A  D 1 0 0 1
于 2012-07-10T00:52:09.703 に答える
1

ベース ソリューション:

test <- data.frame( C1=c("A","B","D","A"),
                C2=c("B","D","C","D"),
                stringsAsFactors=FALSE
            )

uniqnames <- sort(unique(unlist(test[,1:2])))
idcols <- (t(apply(test, 1 , '%in%', x = uniqnames)) + 0) #thanks mnel!
colnames(idcols) <- uniqnames

result <- cbind(
    test,
    idcols
    )

最終的なデータセット:

> result
  C1 C2 A B C D
1  A  B 1 1 0 0
2  B  D 0 1 0 1
3  D  C 0 0 1 1
4  A  D 1 0 0 1
于 2012-07-10T03:13:37.673 に答える
0

パッケージcastからできると思います。今はコードをテストできません (R のバージョンが古すぎて、現在再コンパイル中です)reshape

cast(cbind(input, 1), C1 ~ C2, sum, add.missing=T)

これは実際に各ペアが出現する回数をカウントし、この動作を変更sumして定数関数に置き換えます(おそらく、cbind/sum を必要としないもっときれいな方法がありますが、私の R はかなり錆びています)。

編集: add.missing を追加

于 2012-07-10T01:01:18.330 に答える