根据R中的因子级别进行聚合(创建新列?)

时间:2015-02-02 09:39:01

标签: r aggregate

我有一系列日期和一系列类别。我想按日期聚合类别数组,计算出现次数。如果我这样做:

array <- aggregate(array$category,by=list(array$date),FUN="length")

我会得到所有类别的出现次数。我想要该类别的每个因素的出现次数。

我有几个数据,每个数据都有自己的类别。它有5到9个类别,在每个日期,您可以有不同的类别。

示例数据是:

category dateop
   3 05/07/2012
   3 05/07/2012
   4 05/07/2012
   4 05/07/2012
   4 05/07/2012
   4 05/07/2012
   5 05/07/2012
   5 05/07/2012
   5 05/07/2012
   3 05/07/2012
   3 05/07/2012
   3 05/07/2012
   3 03/07/2012
   1 04/07/2012
   5 05/07/2012
   5 05/07/2012
   5 05/07/2012
   5 05/07/2012
   5 05/07/2012
   3 05/07/2012

我想我必须创建新的数组来保持每个类别的出现。我编写了一个函数,在每个级别上执行for循环并创建一个新数组,但我想知道是否有更快(并且代码更少)的方法来执行此操作。

谢谢!

1 个答案:

答案 0 :(得分:4)

以下是两种可能的简单解决方案(我会调用您的数据集df,但它不是比array更好的名称

library(data.table)  
setDT(df)[, .(occurrences  = .N), .(date, category)]

#          date category occurrences
# 1: 05/07/2012        3           6
# 2: 05/07/2012        4           4
# 3: 05/07/2012        5           8
# 4: 03/07/2012        3           1
# 5: 04/07/2012        1           1

或者

library(dplyr)
df %>%
  group_by(date, category) %>%
  summarise(occurrences = n())

# Source: local data table [5 x 3]
# Groups: date
# 
#         date category occurrences
# 1 05/07/2012        3           6
# 2 05/07/2012        4           4
# 3 05/07/2012        5           8
# 4 03/07/2012        3           1
# 5 04/07/2012        1           1

或者用基础R

df$occurrences <- 1
aggregate(occurrences ~ date + category, df, sum)
#         date category occurrences
# 1 04/07/2012        1           1
# 2 03/07/2012        3           1
# 3 05/07/2012        3           6
# 4 05/07/2012        4           4
# 5 05/07/2012        5           8

和@akruns超级矢量化解决方案

subset(as.data.frame(table(df[2:1])), !!Freq)