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