2

私はRに比較的慣れていないので、データを適切な形式に変換しようとすると、ちょっとハングアップします。reshapeパッケージはこれに役立つようですが、それ以上のことはしません。

列の1つ(V4)に文字列と数値が含まれているデータフレームがあります。V2とV1で与えられたグループ化によってV4を分割し、結果を3つの別々の列としてデータフレームに添付したいと思います。

編集:私の元のサンプルデータフレームは問題の複雑さを完全には捉えていなかったので、より正確な例を次に示します。

>df <- data.frame(V1=c(rep("SN", 8),rep("JK", 4)), 
             V2=c(1,1,2,2,2,3,3,3,1,1,2,2), 
             V3=c("Picture", "Response", "Sound", "Sound", "Response", "Sound", "Sound", "Response", "Sound", "Response", "Sound", "Sound"), 
             V4=c("Photo", "100", "XYZc02i03", "XYZq02i03", 200, "ZYXc01i30", "ZYXq01i30", 100, "XYZc02i40", 200, "XYZc02i03", "XYZq02i03" ), 
             stringsAsFactors=FALSE)


>V1 V2       V3        V4
 SN  1  Picture     Photo
 SN  1 Response       100
 SN  2    Sound XYZc02i03
 SN  2    Sound XYZq02i03
 SN  2 Response       200
 SN  3    Sound ZYXc01i30
 SN  3    Sound ZYXq01i30
 SN  3 Response       100
 JK  1    Sound XYZc02i40
 JK  1 Response       200
 JK  2    Sound XYZc02i03
 JK  2    Sound XYZq02i03

そして、私はこのようなものを手に入れたいです:

   V1  V2       V3          V4        V5   V6
   SN   1  Picture       Photo        NA  100
   SN   2    Sound   XYZc02i03 XYZq02i03  200
   SN   3    Sound   ZYXc01i30 ZYXq01i30  100
   JK   1    Sound   XYZc02i40        NA  200
   JK   2    Sound   XYZc02i03 XYZq02i03   NA

編集:V2で常に同じ数の観測値があるとは限りません。つまり、取得したいデータフレームにV4、V5、またはV6の値が欠落している可能性があります。

Edit2:V6は、V3からの「応答」変数にマップする必要があります。V4およびV5は、理想的には、V3からの「サウンド」値に連続した順序でマップします。

これについてのアドバイスをいただければ幸いです。または、この問題が他の場所で解決されていて、私がそれを見逃した場合は、リンクも素晴らしいでしょう。

4

1 に答える 1

0

cbindの定義にを含める必要はありませんdf。次のようなものを使用します。

df <- data.frame(V1=rep("SN", 6), 
                 V2=rep(2:3, each=3), 
                 V3=c("Sound", "Sound", "Response", "Sound", "Sound", "Response"), 
                 V4=c("XYZc02i03", "XYZq02i03", 200, "ZYXc01i30", "ZYXq01i30", 100), 
                 stringsAsFactors=FALSE)

ただし、説明したようなデータフレームが与えられた場合、次の方法で目的の結果を得ることができます。

max.subset.len <- 3 # or maybe max(sapply(split(df, list(df$V1, df$V2)), FUN=nrow))
fun <- function(v4) {length(v4) <- max.subset.len; v4}
agg <- aggregate(df$V4, by=list(df$V1, df$V2), FUN=fun)
results <- cbind(agg[1:2], agg[[3]])
于 2012-06-11T15:11:31.920 に答える