聚合函数出错

时间:2013-09-03 12:30:25

标签: r aggregate

我有一个数据框:

head(df)
     Year          Find             Found
6982 1901          267              246
6983 1901          271              251
6984 1902          317              236
6985 1903          339              244
6986 1904          339              260
6987 1903          345              15
5255 1902           47              45
5256 1901           46              NA
5257 1906           45              150
5258 1905           42              24
5259 1910           42              78
5260 1910           41              NA

当我尝试聚合它时:

aggdata <-aggregate(df, by=list(Year), 
                  FUN=sum, na.rm=TRUE)

我得到error

Error in aggregate.data.frame(AndelKvinnorUttax, by = list(Year), FUN = sum,  : 
  object 'Year' not found

我找不到问题...

我的solution是:

aggr=cbind(aggregate(data=df,Find~Year,
           FUN=sum,na.rm=TRUE),aggregate(data=df,Found~Year,
           FUN=sum,na.rm=TRUE))[,c(1,2,4)]

任何?

最诚挚的问候!

2 个答案:

答案 0 :(得分:4)

或者,既然您在“解决方案”中使用公式方法,为什么不在实际解决方案中使用它呢?

使用.指定“所有其他变量”。

此外,使用formula方法,NA值的处理方式也不同。您需要为na.rm函数指定sum,为na.pass指定aggregate

aggregate(. ~ Year, df, sum, na.rm = TRUE, na.action="na.pass")
#   Year Find Found
# 1 1901  584   497
# 2 1902  364   281
# 3 1903  684   259
# 4 1904  339   260
# 5 1905   42    24
# 6 1906   45   150
# 7 1910   83    78

对于多样性(以及一些简单的语法),当然有data.table

library(data.table)
DT <- data.table(df)
DT[, lapply(.SD, sum, na.rm=TRUE), by = Year]
#    Year Find Found
# 1: 1901  584   497
# 2: 1902  364   281
# 3: 1903  684   259
# 4: 1904  339   260
# 5: 1906   45   150
# 6: 1905   42    24
# 7: 1910   83    78

答案 1 :(得分:2)

aggregate不会自动评估Year参数中data.frame范围内的data。你必须明确地告诉它在哪里找到Year,即......

aggdata <-aggregate(df, by=list(df$Year), 
                  FUN=sum, na.rm=TRUE)
#  Group.1 Year Find Found
#1    1901 5703  584   497
#2    1902 3804  364   281
#3    1903 3806  684   259
#4    1904 1904  339   260
#5    1905 1905   42    24
#6    1906 1906   45   150
#7    1910 3820   83    78