Код агрегации отображает: Ошибка в model.frame.default… переменная длина отличается - PullRequest
0 голосов
/ 05 июня 2018

Я использую набор данных 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/ А.Он был удален с помощью функции 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 голосов
/ 05 июня 2018

Не уверен, что происходит с разными длинами, но вы можете попробовать другое решение, используя data.table, чтобы увидеть, является ли ошибка воспроизводимой:

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

Посмотрите, достигает ли это результата, который выпосле.

ОБНОВЛЕНИЕ:

Предполагается, что ваши данные имеют формат:

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

Другими словами, они были расплавлены, так что "long "на протяжении многих лет, вам просто нужно сделать следующее:

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. Мы определяем те сolumns с простым оператором grep, который находит имена столбцов, которые включают в себя букву "Y", в вашем случае столбцы года.

...