12

我想计算数据框中某个因素的出现次数。例如,在下面的代码中计算给定类型的事件数:

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

但是,如果我知道有 3 种类型的事件A,BC, 并且我还想查看是 的计数,C0怎么办?换句话说,我希望输出为:

     type quantity
1    A        3
2    B        1
3    C        0

我该怎么做呢?感觉应该在某个地方定义一个函数来执行此操作。

以下是我关于如何解决这个问题的两个不太好的想法。

想法#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))
4

6 回答 6

22

如果您将events变量正确定义为具有所需三个级别的因子,您将免费获得此功能:

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()该因素已经做了正确的事情,ddply()如果你告诉它不要这样做也可以drop

R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE)
  type quantity
1    A        3
2    B        1
3    C        0
R> 
于 2013-04-18T03:29:56.623 回答
4
> xtabs(quantity~type, events)
type
A B C 
3 1 0 
于 2013-04-18T03:41:19.193 回答
2

使用 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
于 2017-10-11T08:08:03.743 回答
0

与@DWin 的回答非常相似:

> aggregate(quantity~type, events, FUN=sum)
  type quantity
1    A        3
2    B        1
3    C        0
于 2013-04-18T03:45:12.703 回答
0

在数据中,您将数据框放入您的类别中。

table(factor(data, levels = 1:5)) 
于 2019-05-30T21:43:33.107 回答
0

type列转为因子并使用count.

library(dplyr)
library(tidyr)

events %>% count(type = factor(type, c('A', 'B', 'C')), .drop = FALSE)

#  type n
#1    A 2
#2    B 1
#3    C 0

另一种选择是complete

events %>%
  count(type) %>%
  complete(type = c('A', 'B', 'C'), fill = list(n = 0))
于 2021-03-21T05:03:13.177 回答