4

我有一个数据框:

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)]

任何人?

此致!

4

2 回答 2

4

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

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

此外,使用该formula方法,NA值的处理方式也不同。您需要na.rm指定函数sumna.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
于 2013-09-03T13:19:48.647 回答
2

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

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
于 2013-09-03T12:51:57.360 回答