2013-04-18 122 views
10

我想计算数据帧中因子出现的次数。例如,要算在下面的代码给定类型的事件数:计算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 

但是,如果我知道,有三种类型的事件A,BC,我也想看看C这是0的计数?换句话说,我想输出为:

 type quantity 
1 A  3 
2 B  1 
3 C  0 

我该怎么做?感觉应该有一个函数定义在某处。

以下是我关于如何去做这件事的两个不太好的想法。

想法#1:我知道我可以通过使用for循环做到这一点,但我知道,它被广泛地说,如果你在R使用for循环,那么你正在做的事情不对,必须做一个更好的方法。

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

'é < - sapply(events,FUN = as.factor);表(e)' – isomorphismes 2014-02-10 06:35:10

回答

19

,如果你正确地定义你的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> 
+0

+ 1并删除我的。 – mnel 2013-04-18 03:31:00

+0

+1出于同样的原因...... :-) – 2013-04-18 03:32:39

4
> xtabs(quantity~type, events) 
type 
A B C 
3 1 0 
+0

Doh,甚至更好。尼斯。不知何故,我总是忘记'xtabs'。但也需要我显示的修正因子变量。 – 2013-04-18 03:44:31

+0

我只使用OP的数据。在'xtabs'中有一个隐含的'sum'。 – 2013-04-18 04:02:14

0

神似@迪文的回答是:

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

需要更正的因子变量,因为在我的答案,但。 – 2013-04-18 03:46:16

+0

@DirkEddelbuettel或他的定义,与虚拟条目(我实际使用)。 – 2013-04-18 03:47:42

+0

这相当于一个更复杂的方式 - char变量后来被聚合变成一个因子。 – 2013-04-18 03:49:30

1

使用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