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

根据R中的因子级别进行聚合(创建新列?),r,aggregate,R,Aggregate,我有一个日期数组和一个类别数组。我想按日期聚合类别数组,计算出现的次数。如果我这样做: array <- aggregate(array$category,by=list(array$date),FUN="length") 我想我必须创建新的数组来保存每个类别的出现。我已经编写了一个函数,在每个级别上执行for循环并创建一个新数组,但是我想知道是否有一种更快(并且代码更少)的方法来实现这一点 谢谢大家! 这里有两种可能的简单解决方案(我将称您的数据集为df,尽管它的名称并不比数组更好)

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

array <- aggregate(array$category,by=list(array$date),FUN="length")
我想我必须创建新的数组来保存每个类别的出现。我已经编写了一个函数,在每个级别上执行for循环并创建一个新数组,但是我想知道是否有一种更快(并且代码更少)的方法来实现这一点


谢谢大家!

这里有两种可能的简单解决方案(我将称您的数据集为
df
,尽管它的名称并不比
数组
更好)

还是用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

这里有两种可能的简单解决方案(我将您的数据集称为
df
,尽管它的名称并不比
array
更好)

还是用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

@akrun,我认为OP正在寻找
库(data.table);setDT(数组)[,.N,.(类别,日期)]
@DavidArenburg是的,我没有测试它。谢谢,这就成功了,谢谢你@akrun,我认为OP正在寻找
库(data.table);setDT(数组)[,.N,.(类别,日期)]
@DavidArenburg是的,我没有测试它。谢谢,这就成功了,谢谢你!我很感谢你的意见,谢谢!我更喜欢dplyr的解决方案,但我想这是一件很有品味的事情。你也可以用base R轻松地完成它,请参见我的编辑,尽管我选择的工具总是
数据。表
。我感谢你的输入,谢谢!我更喜欢dplyr的解决方案,但我想这是一件很有品味的事情。你也可以用base R轻松地完成它,请参见我的编辑,尽管我选择的工具总是
data.table
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
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
subset(as.data.frame(table(df[2:1])), !!Freq)