5

plyr パッケージの ddply 関数の使用に問題があります。次のデータを、各グループ内のカウントと比率で要約しようとしています。ここに私のデータがあります:

    structure(list(X5employf = structure(c(1L, 3L, 1L, 1L, 1L, 3L, 
1L, 1L, 1L, 3L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 1L, 3L, 1L, 
3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 
3L, 3L, 1L), .Label = c("increase", "decrease", "same"), class = "factor"), 
    X5employff = structure(c(2L, 6L, NA, 2L, 4L, 6L, 5L, 2L, 
    2L, 8L, 2L, 2L, 2L, 7L, 7L, 8L, 11L, 7L, 2L, 8L, 8L, 11L, 
    7L, 6L, 2L, 5L, 2L, 8L, 7L, 7L, 7L, 8L, 6L, 7L, 5L, 5L, 7L, 
    2L, 6L, 7L, 2L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 2L, 5L, 2L, 2L, 
    2L, 5L, 12L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 5L, 2L, 5L, 2L, 
    13L, 9L, 9L, 9L, 7L, 8L, 5L), .Label = c("", "1", "1  and 8", 
    "2", "3", "4", "5", "6", "6 and 7", "6 and 7 ", "7", "8", 
    "1 and 8"), class = "factor")), .Names = c("X5employf", "X5employff"
), row.names = c(NA, 73L), class = "data.frame")

そして、これがddplyを使用した私の呼び出しです:

ddply(kano_final, .(X5employf, X5employff), summarise, n=length(X5employff), prop=(n/sum(n))*100)

これにより、各インスタンスのカウントが正しく表示されますが、次のようX5employffに、因子の各レベル内ではなく、各行で比率が計算されているように見えます。X5employf

   X5employf X5employff  n prop
1   increase          1 26  100
2   increase          2  1  100
3   increase          3 15  100
4   increase    1 and 8  1  100
5   increase       <NA>  1  100
6   decrease          4  1  100
7   decrease          5  5  100
8   decrease          6  2  100
9   decrease          7  1  100
10  decrease          8  1  100
11      same          4  4  100
12      same          5  6  100
13      same          6  5  100
14      same    6 and 7  3  100
15      same          7  1  100

各グループ内の比率を手動で計算すると、次のようになります。

   X5employf X5employff  n prop
1   increase          1 26  59.09
2   increase          2  1  2.27
3   increase          3 15  34.09
4   increase    1 and 8  1  2.27
5   increase       <NA>  1  2.27
6   decrease          4  1  10.00
7   decrease          5  5  50.00
8   decrease          6  2  20.00
9   decrease          7  1  10.00
10  decrease          8  1  10.00
11      same          4  4  21.05
12      same          5  6  31.57
13      same          6  5  26.31
14      same    6 and 7  3  15.78
15      same          7  1  5.26

ご覧のとおり、因子 X5employf の各レベルの比率の合計は 100 です。

これはおそらくばかばかしいほど単純であることはわかっていますが、あらゆる種類の同様の投稿を読んでも、頭を悩ませているようには見えません. これと、要約機能がどのように機能するかについての私の理解を手伝ってくれる人はいますか?!

大変感謝します

マーティ

4

3 に答える 3

7

ddply各呼び出しに渡されるsummarizeのは、グループ変数の特定の組み合わせのデータのサブセットであるため、1 回の呼び出しで行うことはできません。この最下位レベルでは、その中間レベルにはアクセスできませんsum(n)。代わりに、次の 2 つの手順で行います。

kano_final <- ddply(kano_final, .(X5employf), transform,
                    sum.n = length(X5employf))

ddply(kano_final, .(X5employf, X5employff), summarise, 
      n = length(X5employff), prop = n / sum.n[1] * 100)

編集:単一のddply呼び出しを使用しtable、あなたがほのめかしたように使用します:

ddply(kano_final, .(X5employf), summarise,
      n          = Filter(function(x) x > 0, table(X5employff, useNA = "ifany")),
      prop       = 100* prop.table(n),
      X5employff = names(n))
于 2013-08-05T11:46:04.660 に答える
0

どうやらやりたいことは、X5employf のすべての値に対する X5employff の比率を調べることです。ただし、X5employf と X5employff が異なることを ddply に伝えません。ddply にとって、これら 2 つの変数は、データを分割するための 2 つの変数にすぎません。また、1 行に 1 つのオブザベーションがあるため、つまり、データのすべての行で count = 1 であるため、各 (X5employf, X5employff) の組み合わせの長さは、各 (X5employf, X5employff) の組み合わせの合計に等しくなります。

私が考えることができるあなたの問題を解決するための最も簡単な「方法」は次のとおりです。

result <- ddply(kano_final, .(X5employf, X5employff), summarise, n=length(X5employff), drop=FALSE)
n <- result$n
n2 <- ddply(kano_final, .(X5employf), summarise, n=length(X5employff))$n
result <- data.frame(result, prop=n/rep(n2, each=13)*100)

古き良き xtab を使用することもできます。

a <- xtabs(~X5employf + X5employff, kano_final)
b <- xtabs(~X5employf, kano_final)
a/matrix(b, nrow=3, ncol=ncol(a))
于 2013-08-05T12:29:00.033 に答える