#r
#r
Вопрос:
Извиняюсь, я предполагаю, что, вероятно, есть очень простой ответ, который я не смог выработать.
У меня есть таблица, которую я изменил. Я хотел бы интерполировать население только за годы = 2010: 2020. Таблица включает только 1 страну, но в таблице 16107 строк.
Я знаю, что уравнение интерполяции: mutate_at(vars(population, gdp.x), na.approx, method="linear"
Я попытался применить: apply(ssp[5,6], ssp[2]==2010:2020, mutate_at(vars(population, gdp.x), na.approx, method="linear"))
Groups: Country [177]
Country Year Model Scenario population gdp.x SSP Version Date Series.Name Series.Code Country.Code gdp.y
<chr> <dbl> <chr> <chr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 Afghanistan 2010 OECD Env-Growth SSP2_v9_130325 28.0 0.0159 SSP2 v9 130325 NA NA NA NA
2 Afghanistan 2011 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 NA NA NA NA
3 Afghanistan 2012 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 NA NA NA NA
4 Afghanistan 2013 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 NA NA NA NA
5 Afghanistan 2014 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 NA NA NA NA
6 Afghanistan 2015 OECD Env-Growth SSP2_v9_130325 31.8 0.0206 SSP2 v9 130325 NA NA NA NA
7 Afghanistan 2016 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 NA NA NA NA
8 Afghanistan 2017 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 GDP growth, constant 2010 USD NYGDPMKTPKDZ AFG 2.7
9 Afghanistan 2018 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 GDP growth, constant 2010 USD NYGDPMKTPKDZ AFG 1.8
10 Afghanistan 2019 OECD Env-Growth SSP2_v9_130325 NA NA SSP2 v9 130325 GDP growth, constant 2010 USD NYGDPMKTPKDZ AFG 2.9
# ... with 16,097 more rows
dput первых 20 строк
structure(list(Country = c("Afghanistan", "Afghanistan", "Afghanistan",
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",
"Afghanistan", "Afghanistan"), Year = c(2010, 2011, 2012, 2013,
2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024,
2025, 2026, 2027, 2028, 2029), Model = c("OECD Env-Growth", "OECD Env-Growth",
"OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth",
"OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth",
"OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth",
"OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth", "OECD Env-Growth",
"OECD Env-Growth", "OECD Env-Growth"), Scenario = c("SSP2_v9_130325",
"SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325",
"SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325",
"SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325",
"SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325",
"SSP2_v9_130325", "SSP2_v9_130325", "SSP2_v9_130325"), population = c(27.962207,
NA, NA, NA, NA, 31.82735098, NA, NA, NA, NA, 36.142924, NA, NA,
NA, NA, 40.89646358, NA, NA, NA, NA), gdp.x = c(0.01593680064,
NA, NA, NA, NA, 0.02062235783, NA, NA, NA, NA, 0.02575387325,
NA, NA, NA, NA, 0.03327524539, NA, NA, NA, NA), SSP = c("SSP2",
"SSP2", "SSP2", "SSP2", "SSP2", "SSP2", "SSP2", "SSP2", "SSP2",
"SSP2", "SSP2", "SSP2", "SSP2", "SSP2", "SSP2", "SSP2", "SSP2",
"SSP2", "SSP2", "SSP2"), Version = c("v9", "v9", "v9", "v9",
"v9", "v9", "v9", "v9", "v9", "v9", "v9", "v9", "v9", "v9", "v9",
"v9", "v9", "v9", "v9", "v9"), Date = c("130325", "130325", "130325",
"130325", "130325", "130325", "130325", "130325", "130325", "130325",
"130325", "130325", "130325", "130325", "130325", "130325", "130325",
"130325", "130325", "130325"), Series.Name = c(NA, NA, NA, NA,
NA, NA, NA, "GDP growth, constant 2010 USD", "GDP growth, constant 2010 USD",
"GDP growth, constant 2010 USD", "GDP growth, constant 2010 USD",
"GDP growth, constant 2010 USD", NA, NA, NA, NA, NA, NA, NA,
NA), Series.Code = c(NA, NA, NA, NA, NA, NA, NA, "NYGDPMKTPKDZ",
"NYGDPMKTPKDZ", "NYGDPMKTPKDZ", "NYGDPMKTPKDZ", "NYGDPMKTPKDZ",
NA, NA, NA, NA, NA, NA, NA, NA), Country.Code = c(NA, NA, NA,
NA, NA, NA, NA, "AFG", "AFG", "AFG", "AFG", "AFG", NA, NA, NA,
NA, NA, NA, NA, NA), gdp.y = c(NA, NA, NA, NA, NA, NA, NA, 2.7,
1.8, 2.9, -5.5, 1, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA,
-20L), groups = structure(list(Country = "Afghanistan", .rows = structure(list(
1:20), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr",
"list"))), row.names = 1L, class = c("tbl_df", "tbl", "data.frame"
), .drop = TRUE), class = c("grouped_df", "tbl_df", "tbl", "data.frame"
))
Ответ №1:
- Не смешивайте
dplyr
и не используйте синтаксис R. mutate_at
заменено, теперь вы можете использоватьacross
.
library(dplyr)
ssp %>%
group_by(year) %>%
mutate(across(c(population, gdp.x), ~if(first(year) %in% 2010:2020)
na.approx(., method="linear") else .)) -> result
result
Комментарии:
1. Привет, ронак. Спасибо за это. Однако я все еще не могу определить годы, в которые я хотел бы выполнить интерполяцию. Это выполняет интерполяцию для всех лет (2010: 2100). Спасибо
2. Для всех остальных лет вы хотите сохранить значения как есть? Обновленный ответ может помочь.
3. Я хотел бы сохранить остальные значения, которые в основном являются NA. Однако ваше решение по-прежнему не работает. Возможно, что-то в синтаксисе, которое я не понимаю?
4. Что вы подразумеваете под «не работает»? Можете ли вы предоставить подмножество ваших данных в воспроизводимом формате (с использованием
dput
), с помощью которого я могу протестировать свое решение?5. Я скопировал первые 20 строк основных столбцов для этого вопроса в таблицу выше — извините, не уверен, как использовать dput.
Ответ №2:
Мне удалось это решить:
Я выполнил интерполяцию совокупности для полного фрейма данных, используя
mutate_at(vars(population), na.approx, method="linear")
Для ВВП, который я хотел интерполировать только для определенных лет, я использовал case_when:
ssp<-ssp%>%mutate(gdp = case_when(Year>=2010 amp; Year<=2020 ~ na.approx(gdp)))