0

次の形式のデータ フレームがあり、集計値に基づいてテーブルを取得したいと考えています。

VALUE   Time1   Time2
   1    NN  NF
   2    FF  FF
   7    NF  FF
   4    NN  NN
   3    NN  FF
   3    NF  NF
   5    NF  NF
   6    FF  FF

table()関数 を使用して簡単なテーブルを作成できます

 table(Time1,Time2)

次の出力が得られます

     FF FN  NF  NN  Total
 FF  2  0   0   0    2
 FN  0  0   0   0    0
 NF  1  0   2   0    3

Total 3 0   2   0    5

上記のデータ フレームを、 VALUE列の合計に基づいてクロス集計したいと考えています。sumif関数を使用してExcelでそれを行うと、次の出力が得られます。

    FF  FN  NF  NN  Total
 FF 8   0   0   0   8
 FN 0   0   0   0   0
 NF 7   0   8   0   15
 NN 3   0   1   4   8
 Total  18  0   9   4   31

R でこれを行うには助けが必要ですか?

4

1 に答える 1

4

あなたの場合には、sum単に使用できますxtabsaddmarginsここでは、合計も取得するためにラップしました。

addmargins(xtabs(VALUE ~ Time1 + Time2, mydf))
#      Time2
# Time1 FF NF NN Sum
#   FF   8  0  0   8
#   NF   7  8  0  15
#   NN   3  1  4   8
#   Sum 18  9  4  31

dcastより一般的には、「reshape2」から見たいと思うかもしれません:

library(reshape2)
dcast(mydf, Time1 ~ Time2, value.var="VALUE", fun.aggregate=sum, margins=TRUE)
#   Time1 FF NF NN (all)
# 1    FF  8  0  0     8
# 2    NF  7  8  0    15
# 3    NN  3  1  4     8
# 4 (all) 18  9  4    31

@ SimonO101の質問に対処するために、データが正しく因数分解されている場合、デフォルトですべてのレベルがxtabsアプローチで表示されます。drop = FALSEただし、dcastバージョンで指定する必要があります。

上記のデータ (「FN」の「Time1」または「Time2」が含まれていないため) を取得して、factorこれらの両方の列を調べて、出力がどのように変化するかを見てみましょう。

mydf[-1] <- lapply(mydf[-1], function(x) factor(x, c("FF", "FN", "NF", "NN")))
addmargins(xtabs(VALUE ~ Time1 + Time2, mydf))
#      Time2
# Time1 FF FN NF NN Sum
#   FF   8  0  0  0   8
#   FN   0  0  0  0   0
#   NF   7  0  8  0  15
#   NN   3  0  1  4   8
#   Sum 18  0  9  4  31

前述のように、dcast同等のものは次のようになります。

dcast(mydf, Time1 ~ Time2, value.var="VALUE", 
      fun.aggregate=sum, margins=TRUE, drop=FALSE)
于 2013-11-13T16:30:36.493 に答える