3

空のレベルを落とさずにテーブルを要約または集計したいと考えています。誰かがこれについて何か考えを持っているのだろうか?

例として、これはデータフレームです

df1<-data.frame(Method=c(rep("A",3),rep("B",2),rep("C",4)),
       Type=c("Fast","Fast","Medium","Fast","Slow","Fast","Medium","Slow","Slow"),
            Measure=c(1,1,2,1,3,1,1,2,2))

doByベースとパッケージを使用した 2 つのアプローチ。

#base
aggregate(Measure~Method+Type,data=df1,FUN=length)

require(doBy)
summaryBy(Measure~Method+Type,data=df1,FUN=length)

どちらも同じ結果を異なる方法でソートしますが、問題は、メソッドとタイプのすべての組み合わせと、欠落しているメジャーを NA として挿入したいということです。または、両方の因子のすべてのレベルを維持する必要があります。

df1$Type
df1$Method

何かがあるのか​​もしれplyrませんが、それがどのように機能するかはわかりません。

4

5 に答える 5

4

見てくださいtapply

with(df1, tapply(Measure, list(Method, Type), FUN = length))

#   Fast Medium Slow
# A    2      1   NA
# B    1     NA    1
# C    1      1    2
于 2014-01-06T20:29:53.960 に答える
1

ベース R では、by欠損値の結果を返します。

result <- by(df1, INDICES=list(df1$Method, df1$Type), FUN=nrow)
cbind(expand.grid(attributes(result)$dimnames), as.vector(result))

#   Var1   Var2 as.vector(result)
# 1    A   Fast                 2
# 2    B   Fast                 1
# 3    C   Fast                 1
# 4    A Medium                 1
# 5    B Medium                NA
# 6    C Medium                 1
# 7    A   Slow                NA
# 8    B   Slow                 1
# 9    C   Slow                 2
于 2014-01-06T20:31:42.667 に答える
1

ベース R で試すことができますby()。たとえば、

tab <- with(df1, by(df1, list(Method = Method, Type = Type), FUN = length))
Method: A
Type: Fast
[1] 2
------------------------------------------------------------ 
Method: B
Type: Fast
[1] 1
------------------------------------------------------------ 
Method: C
Type: Fast
[1] 1
------------------------------------------------------------ 
Method: A
Type: Medium
[1] 1
------------------------------------------------------------ 
Method: B
Type: Medium
[1] NA
------------------------------------------------------------ 
Method: C
Type: Medium
[1] 1
------------------------------------------------------------ 
Method: A
Type: Slow
[1] NA
------------------------------------------------------------ 
....

print()それは単に複雑に見える方法であることに注意してください。の場合unclass() tab、この例では単なる多方向テーブルであることがわかります。

R> unclass(tab)
      Type
Method Fast Medium Slow
     A    2      1   NA
     B    1     NA    1
     C    1      1    2
attr(,"call")
by.data.frame(data = df1, INDICES = list(Method = Method, Type = Type), 
    FUN = nrow)

それは単なる配列(行列)なので、それを扱うことができます。長い形式でこれを好む場合は、簡単に巻き戻すことができます。

nr <- nrow(tab)
ltab <- cbind.data.frame(Method = rep(rownames(tab), times = nr),
                         Type = rep(colnames(tab), each = nr),
                         Count = c(tab))
ltab

R> ltab
  Method   Type Count
1      A   Fast     2
2      B   Fast     1
3      C   Fast     1
4      A Medium     1
5      B Medium    NA
6      C Medium     1
7      A   Slow    NA
8      B   Slow     1
9      C   Slow     2
于 2014-01-06T20:31:55.783 に答える
0

回答ありがとうございます。それらのすべてが結果を出すために働いていると思います。しかし、このコードに関するMark Heckmannのコメント

ddply(df1, .(Method, Type), summarise, Measure=length(Measure), .drop=F)

適切なヘッダーと最小限のコードで、きれいな出力データフレームが得られるようです。欠点としては、追加のパッケージが必要です。

于 2014-01-06T20:57:50.767 に答える