我想计算数据帧中某个因子的出现次数。例如,要计算以下代码中给定类型的事件数:
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
,我还希望看到C
的计数,即0
?换句话说,我希望输出为:
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))
答案 0 :(得分:20)
如果您将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>
答案 1 :(得分:4)
> xtabs(quantity~type, events)
type
A B C
3 1 0
答案 2 :(得分: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
答案 3 :(得分:0)
与@ DWin的答案非常相似:
> aggregate(quantity~type, events, FUN=sum)
type quantity
1 A 3
2 B 1
3 C 0
答案 4 :(得分:0)
在数据中,您将数据框和类别归为各个级别。
table(factor(data, levels = 1:5))
答案 5 :(得分: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))