首页 > 解决方案 > 聚合代码显示:model.frame.default 中的错误……可变长度不同

问题描述

我正在使用kaggle 数据集。由于数据集很大,很难插入dput输出。但我正在尝试按地区计算年度粮食产量的总和。我正在为此目的使用聚合。由于某种原因,它显示以下错误:

聚合R代码:

years<-colnames(p[,11:63])
agg<-aggregate(years~area, data=p, sum)

错误:

Error in model.frame.default(formula = years ~ area, data = p) : 
  variable lengths differ (found for 'area')

我尝试了下面的链接,但它似乎对我来说不是很有用:

不是很有用的链接

注意:数据集包含 N/A。已使用na.omit函数删除

bk18评论后更新

> p[, lapply(.SD, class)]
   area_abb area_code   area item_code   item element_code element   Unit latitude longitude
1:   factor   integer factor   integer factor      integer  factor factor  numeric   numeric
     Y1961   Y1962   Y1963   Y1964   Y1965   Y1966   Y1967   Y1968   Y1969   Y1970   Y1971
1: integer integer integer integer integer integer integer integer integer integer integer
     Y1972   Y1973   Y1974   Y1975   Y1976   Y1977   Y1978   Y1979   Y1980   Y1981   Y1982
1: integer integer integer integer integer integer integer integer integer integer integer
     Y1983   Y1984   Y1985   Y1986   Y1987   Y1988   Y1989   Y1990   Y1991   Y1992   Y1993
1: integer integer integer integer integer integer integer integer integer integer integer
     Y1994   Y1995   Y1996   Y1997   Y1998   Y1999   Y2000   Y2001   Y2002   Y2003   Y2004
1: integer integer integer integer integer integer integer integer integer integer integer
     Y2005   Y2006   Y2007   Y2008   Y2009   Y2010   Y2011   Y2012   Y2013
1: integer integer integer integer integer integer integer integer integer

需要输出任何帮助表示赞赏!

提前致谢,

标签: raggregate

解决方案


不确定不同长度会发生什么,但您可以使用 data.table 尝试不同的解决方案,以查看错误是否可重现:

library(data.table)
setDT(mydata)
mydata[, sum(p, na.rm = T), .(years, area)]

看看这是否能达到你想要的结果。

更新:

假设您的数据采用以下格式:

year  area  value
...   ...   ...

换句话说,它已经融化了,所以多年来它“很长”,你应该只需要这样做:

p[, area := as.character(area)]
p[, sum(value, na.rm = T), .(year, area)]

如果它没有先融化,那么将其融化melt()以使其长形,其中列与我上面写的内容相匹配。

但是,如果您想保持您发布的屏幕截图中的内容宽,只需使用 lapply:

p[, area := as.character(area)]
p[, lapply(.SD, sum, na.rm = T), area, .SDcols = colnames(p)[grep("Y", colnames(p))]]

您在这里所做的是应用于sum()每一列(仅此lapply(.SD, sum, na.rm = T)而已。然后,您正在通过area(这是第三个参数)进行操作。该.SD部分(由 控制.SDcols)允许您对正在处理的表进行子集化。这允许您仅对返回的列求和.SDcols。我们使用一个简单的grep语句定义这些列,该语句查找包含字母“Y”的列名,在您的情况下为年份列。


推荐阅读