データフレーム内の因子の発生数を数えたい。たとえば、次のコードで特定のタイプのイベントの数をカウントするには、次のようにします。
library(plyr)
events <- data.frame(type = c('A', 'A', 'B'),
quantity = c(1, 2, 1))
ddply(events, .(type), summarise, quantity = sum(quantity))
出力は次のとおりです。
type quantity
1 A 3
2 B 1
ただし、イベントA
、B
、およびC
の3つのタイプがあり、C
のカウントも確認したい場合はどうなりますか。は0
?言い換えれば、私は出力を次のようにしたいのです。
type quantity
1 A 3
2 B 1
3 C 0
どうすればよいですか?これを行うために定義された関数がどこかにあるはずだと感じています。
以下は、これをどうやって行うかについての私の2つのあまり良くない考えです。
アイデア#1:for
ループを使用してこれを実行できることは知っていますが、for
でR
ループを使用している場合は、実行していると広く言われています。何か問題があります。それを行うためのより良い方法があるはずです。
アイデア#2: 元のデータフレームにダミーエントリを追加します。このソリューションは機能しますが、よりエレガントなソリューションがあるはずだと感じています。
events <- data.frame(type = c('A', 'A', 'B'),
quantity = c(1, 2, 1))
events <- rbind(events, data.frame(type = 'C', quantity = 0))
ddply(events, .(type), summarise, quantity = sum(quantity))
events
変数を目的の3つのレベルの因子として正しく定義すると、これを無料で入手できます。
_R> events <- data.frame(type = factor(c('A', 'A', 'B'), c('A','B','C')),
+ quantity = c(1, 2, 1))
R> events
type quantity
1 A 1
2 A 2
3 B 1
R> table(events$type)
A B C
2 1 0
R>
_
ファクターでtable()
を呼び出すだけで、すでに正しいことが実行されます。drop
に指示しない場合は、ddply()
も実行できます。
_R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE)
type quantity
1 A 3
2 B 1
3 C 0
R>
_
> xtabs(quantity~type, events)
type
A B C
3 1 0
Dplyrライブラリの使用
library(dplyr)
data <- data.frame(level = c('A', 'A', 'B', 'B', 'B', 'C'),
value = c(1:6))
data %>%
group_by(level) %>%
summarize(count = n()) %>%
View
平均、最小、最大の操作も実行することを選択した場合は、これを試してください
data %>%
group_by(level) %>%
summarise(count = n(), Max_val = max(value), Min_val = min(value)) %>%
View
@DWinの答えと非常によく似ています。
> aggregate(quantity~type, events, FUN=sum)
type quantity
1 A 3
2 B 1
3 C 0
データでは、データフレームを配置し、カテゴリをレベルに分けます。
table(factor(data, levels = 1:5))