聚合代码显示:model.frame.default中的错误...变量长度不同

时间:2018-06-05 18:04:32

标签: r aggregate

我正在使用kaggle data set。由于数据集的大小,很难插入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')

我试过下面的链接,但对我来说似乎没什么用处:

Not very useful link

注意:数据集包含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

Output needed感谢任何帮助!

提前致谢,

1 个答案:

答案 0 :(得分:1)

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

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

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

<强>更新

假设您的数据格式为:

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

换句话说,它已融化,因此多年来它“长”,你应该这样做:

melt()

如果它没有先融化,然后用p[, area := as.character(area)] p[, lapply(.SD, sum, na.rm = T), area, .SDcols = colnames(p)[grep("Y", colnames(p))]] 将其融化,以便在列与我上面写的相匹配的情况下得到它。

但是,如果您希望保持广泛,就像您发布的屏幕截图一样,只需使用lapply:

sum()

你在这里做的是将lapply(.SD, sum, na.rm = T)应用于每一列(即area位。然后,你是通过.SD(这是第三个参数)来做的。 .SDcols篇(由.SDcols控制)允许您对正在处理的表进行子集化。这使您只能对grep返回的列求和。我们定义这些列使用简单的{{1}}语句查找包含字母“Y”的列名,在您的情况下为年份列。