Я использую набор данных 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
Любая помощь приветствуется!
Спасибо заранее,
Не уверен, что происходит с разными длинами, но вы можете попробовать другое решение, используя data.table, чтобы увидеть, воспроизводится ли ошибка:
Посмотрите, достигает ли это результат, который вы выполните.
ОБНОВЛЕНИЕ:
Предполагая, что ваши данные в формате:
Если он сначала не растает, а затем расплавить его
melt()
, чтобы получить его в длинной форме, где столбцы соответствуют тому, что я написал выше.Если, однако, вам нравится держать все в ширину, как на скриншоте, который вы опубликовали, просто используйте lapply:
Что вы здесь делаете, применяя
sum()
к каждому столбцу (это битlapply(.SD, sum, na.rm = T)
), Повторяя это с помощьюarea
(это третий аргумент). Часть.SD
(управляемая.SDcols
) позволяет вам подмножать таблицу, над которой вы работаете. Это позволяет вам суммировать только по столбцам, которые возвращаются с помощью.SDcols
. определите эти столбцы с помощью простого выраженияgrep
, в котором указаны имена столбцов, которые включают в себя букву "Y", в вашем случае столбцы года.[.data.table
(p,, sum (p, na.rm = T),. (лет, площадь )): Элементы в списке "by" или "keyby" - это длина (53,17938). Каждая из них должна быть такой же длины, как строки в x или число строк, возвращаемых i (17938).p[, lapply(.SD, class)]
. Бьюсь об заклад, один из них - это список, или фактор, или что-то еще.