Применение функции к определенным строкам данного столбца на основе значений в другом столбце

#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)))