我正在使用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')
我试过下面的链接,但对我来说似乎没什么用处:
注意:数据集包含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
提前致谢,
答案 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”的列名,在您的情况下为年份列。