42

次のようなカウント データがあるとします。

library(tidyr)
library(dplyr)

X.raw <- data.frame(
  x = as.factor(c("A", "A", "A", "B", "B", "B")),
  y = as.factor(c("i", "ii", "ii", "i", "i", "i")),
  z = 1:6
)
X.raw
#   x  y z
# 1 A  i 1
# 2 A ii 2
# 3 A ii 3
# 4 B  i 4
# 5 B  i 5
# 6 B  i 6

以下のように整理してまとめたいと思います。

X.tidy <- X.raw %>% group_by(x, y) %>% summarise(count = sum(z))
X.tidy
# Source: local data frame [3 x 3]
# Groups: x
#
#   x  y count
# 1 A  i     1
# 2 A ii     5
# 3 B  i    15

私はそれを知っておりx=="B"y=="ii"欠損値ではなくゼロのカウントを観察しました。つまり、現場作業員は実際にそこにいましたが、正の数がなかったため、生データに行が入力されませんでした。これを行うことで、ゼロカウントを明示的に追加できます。

X.fill <- X.tidy %>% spread(y, count, fill = 0) %>% gather(y, count, -x)
X.fill
# Source: local data frame [4 x 3]
# 
#   x  y count
# 1 A  i     1
# 2 B  i    15
# 3 A ii     5
# 4 B ii     0

しかし、それは少し回りくどい方法のように思えます。これのためのよりクリーンなイディオムはありますか?

明確にするために: 私のコードは、spreadthenを使用して、必要なことを既に実行してgatherいるため、私が興味を持っているのは、and でより直接的なルートを見つけることです。tidyrdplyr

4

5 に答える 5

32

パラメータをdplyr 0.8設定することでそれを行うことができるので:.drop = FALSEgroup_by

X.tidy <- X.raw %>% group_by(x, y, .drop = FALSE) %>% summarise(count=sum(z))
X.tidy
# # A tibble: 4 x 3
# # Groups:   x [2]
#   x     y     count
#   <fct> <fct> <int>
# 1 A     i         1
# 2 A     ii        5
# 3 B     i        15
# 4 B     ii        0
于 2019-02-20T20:41:56.483 に答える
3

plyr探している機能がありますが、dplyr(まだ)ありません。@momeara で示されているように、ゼロカウント グループを含めるには追加のコードが必要です。この質問も参照してください。最終結果にゼロカウントグループを保持するためにplyr::ddply追加するだけです。.drop=FALSE例えば:

library(plyr)

X.tidy = ddply(X.raw, .(x,y), summarise, count=sum(z), .drop=FALSE)

X.tidy
  x  y count
1 A  i     1
2 A ii     5
3 B  i    15
4 B ii     0
于 2014-09-21T06:18:39.043 に答える
2

可能なすべての組み合わせを明示的に作成し、それを整理された要約に結合できます。

x.fill <- expand.grid(x=unique(x.tidy$x), x=unique(x.tidy$y)) %>%
    left_join(x.tidy, by=("x", "y")) %>%
    mutate(count = ifelse(is.na(count), 0, count)) # replace null values with 0's
于 2014-09-21T06:16:30.520 に答える