web-dev-qa-db-ja.com

ゼロカウントが報告された、Rの因子の発生をカウントします

データフレーム内の因子の発生数を数えたい。たとえば、次のコードで特定のタイプのイベントの数をカウントするには、次のようにします。

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

ただし、イベントAB、およびCの3つのタイプがあり、Cのカウントも確認したい場合はどうなりますか。は0?言い換えれば、私は出力を次のようにしたいのです。

     type quantity
1    A        3
2    B        1
3    C        0

どうすればよいですか?これを行うために定義された関数がどこかにあるはずだと感じています。

以下は、これをどうやって行うかについての私の2つのあまり良くない考えです。

アイデア#1:forループを使用してこれを実行できることは知っていますが、forRループを使用している場合は、実行していると広く言われています。何か問題があります。それを行うためのより良い方法があるはずです。

アイデア#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))
11
I Like to Code

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> 
_
20
> xtabs(quantity~type, events)
type
A B C 
3 1 0 
4
42-

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
2
krish9988

@DWinの答えと非常によく似ています。

> aggregate(quantity~type, events, FUN=sum)
  type quantity
1    A        3
2    B        1
3    C        0
0

データでは、データフレームを配置し、カテゴリをレベルに分けます。

table(factor(data, levels = 1:5)) 
0
Zanoldor