109

の関数で使用summariseする場合、空のカテゴリはデフォルトで削除されます。を追加することで、この動作を変更できます。ただし、 withを使用する場合、これは機能しません。結果に空のカテゴリを保持する別の方法はありますか?plyrddply.drop = FALSEsummarisedplyr

偽のデータの例を次に示します。

library(dplyr)

df = data.frame(a=rep(1:3,4), b=rep(1:2,6))

# Now add an extra level to df$b that has no corresponding value in df$a
df$b = factor(df$b, levels=1:3)

# Summarise with plyr, keeping categories with a count of zero
plyr::ddply(df, "b", summarise, count_a=length(a), .drop=FALSE)

  b    count_a
1 1    6
2 2    6
3 3    0

# Now try it with dplyr
df %.%
  group_by(b) %.%
  summarise(count_a=length(a), .drop=FALSE)

  b     count_a .drop
1 1     6       FALSE
2 2     6       FALSE

まさに私が望んでいたものではありません。dplyrと同じ結果を達成する方法.drop=FALSEはありplyrますか?

4

4 に答える 4

63

問題はまだ未解決ですが、それまでの間、特にデータは既に因数分解されているためcomplete、「tidyr」を使用して探しているものを取得できます。

library(tidyr)
df %>%
  group_by(b) %>%
  summarise(count_a=length(a)) %>%
  complete(b)
# Source: local data frame [3 x 2]
# 
#        b count_a
#   (fctr)   (int)
# 1      1       6
# 2      2       6
# 3      3      NA

置換値をゼロにしたい場合は、次のように指定する必要がありますfill

df %>%
  group_by(b) %>%
  summarise(count_a=length(a)) %>%
  complete(b, fill = list(count_a = 0))
# Source: local data frame [3 x 2]
# 
#        b count_a
#   (fctr)   (dbl)
# 1      1       6
# 2      2       6
# 3      3       0
于 2016-03-18T19:07:51.857 に答える
13

これは質問で尋ねられたものとまったく同じではありませんが、少なくともこの単純な例では、xtabs を使用して同じ結果を得ることができます。次に例を示します。

dplyrを使用:

df %>%
  xtabs(formula = ~ b) %>%
  as.data.frame()

またはそれより短い:

as.data.frame(xtabs( ~ b, df))

結果 (どちらの場合も等しい):

  b Freq
1 1    6
2 2    6
3 3    0
于 2014-05-05T18:46:08.930 に答える