我有一系列日期和一系列类别。我想按日期聚合类别数组,计算出现次数。如果我这样做:
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循环并创建一个新数组,但我想知道是否有更快(并且代码更少)的方法来执行此操作。
谢谢!
答案 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)