Я думаю, что вы можете сделать это несколькими способами.Что я могу порекомендовать, так это воспользоваться пакетом tidyverse
, включающим dplyr
.
Не вдаваясь слишком далеко в то, чего могут достичь dplyr
и tidyverse
, мы можем поговорить о силе встроенных команд dplyr group_by(...)
, summarise(...)
, arrange(...)
и bind_rows(...)
.Кроме того, существует множество отличных учебных пособий, шпаргалок и документации по всем пакетам tidyverse
.
Хотя это все менее и менее актуально в наши дни, мы обычно хотим избегать циклов в R. Поэтому мысоздаст новый фрейм данных, который содержит все остаточные значения, а затем вернет его в исходный фрейм данных.
Шаг 1: Расчет всех остаточных значений
Мы хотимрассчитать сумму значений ООН, сгруппированных по country
и year
.Мы можем достичь этого с помощью этого значения
res_UN = UN_ %>% group_by(country, year) %>% summarise(UN = sum(UN, na.rm = T))
Шаг 2: Добавить столбец сектора к res_UN со значением 'residual'
Это должно привести кфрейм данных, который содержит country
, year
и UN
, теперь нам нужно добавить столбец sector
, значение которого «Остаточное» для удовлетворения ваших требований.
res_UN$sector = 'Residual'
Шаг 3: Добавьте res_UN обратно в UN_ и сделайте соответствующий порядок
res_UN
и UN_
теперь имеют одинаковые столбцы, и теперь их можно добавлять обратно.
UN_ = bind_rows(UN_, res_UN) %>% arrange(country, year, sector)
Собирая все это вместе, вы должны ответить на ваш вопрос, и это может быть достигнуто в пару строк!
TLDR:
res_UN = UN_ %>% group_by(country, year) %>% summarise(UN = sum(UN, na.rm = T))`
res_UN$sector = 'Residual'
UN_ = bind_rows(UN_, res_UN) %>% arrange(country, year, sector)