4

列内の変数が上部の行になるように、ピボットしたい大きなデータ フレームを使用しています。

このような場合、キャスト関数のデフォルトが fun.aggregate=length であることを除けば、reshape パッケージが非常に便利であることがわかりました。おそらくこれは、これらの操作を「ケース」ごとに実行しており、測定される変数の数がケースによって異なるためです。

欠落している変数がピボットされたデータ フレームで「NA」として示されるようにピボットしたいと思います。

言い換えれば、次のような溶融データ フレームから移動したいと考えています。

Case | Variable | Value
 1         1        2.3
 1         2        2.1
 1         3        1.3
 2         1        4.3
 2         2        2.5
 3         1        1.8
 3         2        1.9
 3         3        2.3
 3         4        2.2

このようなものに:

Case | Variable 1 | Variable 2 | Variable 3 | Variable 4
 1         2.3          2.1          1.3         NA
 2         4.3          2.5          NA          NA
 3         1.8          1.9          2.3         2.2 

コード dcast(data,...~Variable) は再びデフォルトで fun.aggregate=length になり、元の値が保持されません。

ご協力ありがとうございます。ご不明な点がありましたらお知らせください。

4

3 に答える 3

5

cast呼び出しにすべての変数を含めるだけです。Reshape はValue列が呼び出されることを想定してvalueいるため、警告がスローされますが、それでも正常に動作します。使用していた理由は、数式fun.aggregate=lengthが欠落しているためです。Caseの値を集計していましたCase

試す:cast(data, Case~Variable)

data <- data.frame(Case=c(1,1,1,2,2,3,3,3,3),
  Variable=c(1,2,3,1,2,1,2,3,4),
  Value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2))

cast(data,Case~Variable)
Using Value as value column.  Use the value argument to cast to override this choice
  Case   1   2   3   4
1    1 2.3 2.1 1.3  NA
2    2 4.3 2.5  NA  NA
3    3 1.8 1.9 2.3 2.2

編集: @Jon からのコメントへの応答として。データ フレームにもう 1 つの変数がある場合はどうしますか?

data <- data.frame(expt=c(1,1,1,1,2,2,2,2,2),
               func=c(1,1,1,2,2,3,3,3,3),
               variable=c(1,2,3,1,2,1,2,3,4),
               value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2))

cast(data,expt+variable~func)
  expt variable   1   2   3
1    1        1 2.3 4.3  NA
2    1        2 2.1  NA  NA
3    1        3 1.3  NA  NA
4    2        1  NA  NA 1.8
5    2        2  NA 2.5 1.9
6    2        3  NA  NA 2.3
7    2        4  NA  NA 2.2
于 2011-06-17T21:17:51.513 に答える
0

これが1つの解決策です。あなたが言及したパッケージや機能は使用しませんが、役立つ可能性があります。データフレームが次のように呼ばれているとしますdf:

M <- matrix(NA,
            nrow = length(unique(df$Case)),
            ncol = length(unique(df$Variable))+1,
            dimnames = list(NULL,c('Case',paste('Variable',sort(unique(df$Variable))))))
irow <- match(df$Case,unique(df$Case))
icol <- match(df$Variable,unique(df$Variable)) + 1
ientry <- irow + (icol-1)*nrow(M)
M[ientry] <- df$Value
M[,1] <- unique(df$Case)
于 2011-06-17T20:59:37.463 に答える