Dplyrコードを手に入れたいが、これを理解できない。ここで説明されている多くの変数について同様の問題があります( dplyrによる因子のカウントの要約 および 新しい変数への行ごとのカウントの挿入、dplyrを使用してRでそれを行う方法? )、しかし、私の仕事はやや小さいです。
データフレームを考えると、変数の頻度をカウントして新しい変数に配置する方法を教えてください。
set.seed(9)
df <- data.frame(
group=c(rep(1,5), rep(2,5)),
var1=round(runif(10,1,3),0))
それから私達にあります:
>df
group var1
1 1 1
2 1 1
3 1 1
4 1 1
5 1 2
6 2 1
7 2 2
8 2 2
9 2 2
10 2 3
グループごと(group
)の回数を示す3番目の列が必要ですvar1
が発生します。この例では、count =(4,4,4,4,1,1,1,3,3,3,1)になります。私は試しました-成功せずに-のようなもの:
df %>% group_by(group) %>% rowwise() %>% do(count = nrow(.$var1))
説明は大歓迎です!
必要なことは、「group」と「var1」の両方の列でデータをグループ化することだけです。
_df %>% group_by(group, var1) %>% mutate(count = n())
#Source: local data frame [10 x 3]
#Groups: group, var1
#
# group var1 count
#1 1 1 4
#2 1 1 4
#3 1 1 4
#4 1 1 4
#5 1 2 1
#6 2 1 1
#7 2 2 3
#8 2 2 3
#9 2 2 3
#10 2 3 1
_
これを行うべきではない方法の例を次に示します。
_df %>% group_by(group, var1) %>% do(data.frame(., count = length(.$group)))
_
n()
を使用したdplyrの実装は、確かにはるかに高速で、クリーンで、短く、上記のような実装よりも常に優先されるべきです。
おそらくこれは新しい機能ですが、1つのdplyr
コマンドで実行できます。
df %>% add_count(group, var1)
group var1 n
1 1 1 4
2 1 1 4
3 1 1 4
4 1 1 4
5 1 2 1
6 2 1 1
7 2 2 3
8 2 2 3
9 2 2 3
10 2 3 1
おそらく別の便利な関数tally
をdplyr
から使用するかもしれません
df %>% group_by(group, var1) %>% tally()
# Source: local data frame [5 x 3]
# Groups: group
#
# group var1 n
# 1 1 1 4
# 2 1 2 1
# 3 2 1 1
# 4 2 2 3
# 5 2 3 1
2つの選択肢:
1:基数R:
# option 1:
df$count <- ave(df$var1, df$var1, df$group, FUN = length)
# option 2:
df <- transform(df, count = ave(var1, var1, group, FUN = length))
与えるもの:
> df group var1 count 1 1 1 4 2 1 1 4 3 1 1 4 4 1 1 4 5 1 2 1 6 2 1 1 7 2 2 3 8 2 2 3 9 2 2 3 10 2 3 1
2:with data.table :
library(data.table)
setDT(df)[, count:=.N, by = .(group, var1)]
同じ結果が得られます:
> df group var1 count 1: 1 1 4 2: 1 1 4 3: 1 1 4 4: 1 1 4 5: 1 2 1 6: 2 1 1 7: 2 2 3 8: 2 2 3 9: 2 2 3 10: 2 3 1
要約する場合は、次を使用できます。
# with base R:
aggregate(id ~ group + var1, transform(df, id = 1), length)
# with 'dplyr':
count(df, group, var1)
# with 'data.table':
setDT(df)[, .N, by = .(group, var1)]