Отображаются коды агрегирования: Ошибка в model.frame.default ... переменная длина отличается

Yes Boss спросил: 12 мая 2018 в 04:24 в: r

Я использую набор данных 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

Любая помощь приветствуется!

Спасибо заранее,

1 ответ

Есть решение
bk18 ответил: 12 мая 2018 в 05:30

Не уверен, что происходит с разными длинами, но вы можете попробовать другое решение, используя 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", в вашем случае столбцы года.

Yes Boss ответил: 12 мая 2018 в 04:33
& GT; библиотека (data.table) > setDT (p) > p [, sum (p, na.rm = T), (годы, область)] Ошибка в [.data.table (p,, sum (p, na.rm = T),. (лет, площадь )): Элементы в списке "by" или "keyby" - это длина (53,17938). Каждая из них должна быть такой же длины, как строки в x или число строк, возвращаемых i (17938).
Yes Boss ответил: 12 мая 2018 в 04:33
Спасибо за ответ. Я использовал выше код, и он произвел выше прокомментированную ошибку
bk18 ответил: 12 мая 2018 в 04:35
Интересно, можете ли вы запустить p[, lapply(.SD, class)]. Бьюсь об заклад, один из них - это список, или фактор, или что-то еще.
Yes Boss ответил: 12 мая 2018 в 04:39
похоже, что моя область является фактором, а мои годы целыми. См. Выше обновление
bk18 ответил: 12 мая 2018 в 04:41
Хорошо, ваши данные в другом формате, чем я думал. Вот в чем проблема, так что медведь со мной на секунду, пока я пересматриваю свой ответ.