Преобразование нескольких числовых значений в описательные имена

#r

#r

Вопрос:

Я пытаюсь преобразовать значения для каждого года между 0:15 в имена, указанные в lc_names:

 lc_names <- tibble(y2010=0:15, y2011=0:15, y2012=0:15, y2013=0:15, y2014=0:15, y2015=0:15, y2016=0:15, y2017=0:15, y2018=0:15, y2019=0:15,
                   lc_name = c("pland_00_water", 
                               "pland_01_evergreen_needleleaf", 
                               "pland_02_evergreen_broadleaf", 
                               "pland_03_deciduous_needleleaf", 
                               "pland_04_deciduous_broadleaf", 
                               "pland_05_mixed_forest",
                               "pland_06_closed_shrubland", 
                               "pland_07_open_shrubland", 
                               "pland_08_woody_savanna", 
                               "pland_09_savanna", 
                               "pland_10_grassland", 
                               "pland_11_wetland", 
                               "pland_12_cropland", 
                               "pland_13_urban", 
                               "pland_14_mosiac", 
                               "pland_15_barren"))
 

Таким образом, я пытался сделать это:

 pland_pred1 <- pland_pred %>% 
  inner_join(lc_names, by = "c(y2010, y2011, y2012, y2013, y2014, y2015, y2016, y2017, y2018, y2019)") %>%
  arrange(c(y2010, y2011, y2012, y2013, y2014, y2015, y2016, y2017, y2018, y2019)) 
 

Однако я получаю эту ошибку:

Ошибка: столбцы соединения должны присутствовать в данных. x Проблема с c(y2010, y2011, y2012, y2013, y2014, y2015, y2016, y2017, y2018, y2019) .

Оба столбца присутствуют:

  pland_pred
# A tibble: 6,041,662 x 12
      id y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 pland
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <dbl>
 1     1    12    12    12    12    12    12    12    12    12    12 1    
 2     2    12    12    12    12    12    12    12    12    12    12 1    
 3     3    12    12    12    12    12    12    12    12    12    12 1    
 4     4    12    12    12    12    12    12    12    12    12    12 1    
 5     5    12    12    12    12    12    12    12    12    12    12 1    
 6     6     3     3     3     3     3     3     3     3     5     5 0.125
 7     6     9     9     9     9     9     8     8     8     8     9 0.125
 8     6     9     9    10    10    10    10    10    10    10    10 0.125
 9     6    10    10    10    10    10    12    12    12    12    12 0.125
10     6    10    10    10    10    12    12    12    12    14    14 0.125
--------------------------------------------------------------------------------
lc_names
# A tibble: 16 x 11
   y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 lc_name                      
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <chr>                        
 1     0     0     0     0     0     0     0     0     0     0 pland_00_water               
 2     1     1     1     1     1     1     1     1     1     1 pland_01_evergreen_needleleaf
 3     2     2     2     2     2     2     2     2     2     2 pland_02_evergreen_broadleaf 
 4     3     3     3     3     3     3     3     3     3     3 pland_03_deciduous_needleleaf
 5     4     4     4     4     4     4     4     4     4     4 pland_04_deciduous_broadleaf 
 6     5     5     5     5     5     5     5     5     5     5 pland_05_mixed_forest        
 7     6     6     6     6     6     6     6     6     6     6 pland_06_closed_shrubland    
 8     7     7     7     7     7     7     7     7     7     7 pland_07_open_shrubland      
 9     8     8     8     8     8     8     8     8     8     8 pland_08_woody_savanna       
10     9     9     9     9     9     9     9     9     9     9 pland_09_savanna             
11    10    10    10    10    10    10    10    10    10    10 pland_10_grassland           
12    11    11    11    11    11    11    11    11    11    11 pland_11_wetland             
13    12    12    12    12    12    12    12    12    12    12 pland_12_cropland            
14    13    13    13    13    13    13    13    13    13    13 pland_13_urban               
15    14    14    14    14    14    14    14    14    14    14 pland_14_mosiac              
16    15    15    15    15    15    15    15    15    15    15 pland_15_barren  
 

Что делать дальше?

Я ожидаю, что каждое значение под каждым годом будет заменено их соответствующими именами в lc_name . Например:

 #example for each year to look like
   y2010                      
                          
 1 pland_00_water               
 2 pland_01_evergreen_needleleaf
 3 pland_02_evergreen_broadleaf 
 4 pland_03_deciduous_needleleaf
 5 pland_04_deciduous_broadleaf 
 6 pland_05_mixed_forest        
 7 pland_06_closed_shrubland    
 8 pland_07_open_shrubland      
 9 pland_08_woody_savanna       
10 pland_09_savanna             
11 pland_10_grassland           
12 pland_11_wetland             
13 pland_12_cropland            
14 pland_13_urban               
15 pland_14_mosiac              
16 pland_15_barren  
 

воспроизводимый код:

 structure(list(id = 1:6, y2010 = c(12L, 12L, 12L, 12L, 12L, 3L
), y2011 = c(12L, 12L, 12L, 12L, 12L, 3L), y2012 = c(12L, 12L, 
12L, 12L, 12L, 3L), y2013 = c(12L, 12L, 12L, 12L, 12L, 3L), y2014 = c(12L, 
12L, 12L, 12L, 12L, 3L), y2015 = c(12L, 12L, 12L, 12L, 12L, 3L
), y2016 = c(12L, 12L, 12L, 12L, 12L, 3L), y2017 = c(12L, 12L, 
12L, 12L, 12L, 3L), y2018 = c(12L, 12L, 12L, 12L, 12L, 5L), y2019 = c(12L, 
12L, 12L, 12L, 12L, 5L), pland = c(1, 1, 1, 1, 1, 0.125)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
 

Воспроизводимый код будет иметь только некоторые значения для преобразования в имена

Ответ №1:

Одним из вариантов является подмножество имен столбцов, в которых startsWith ‘y’, перебор этих имен столбцов map , transmute столбец из ‘pland_pred’ после замены значений соответствующим named вектором из столбцов ‘lc_names’ для столбца year и ‘lc_name’ и присвоение выходных данных тому же столбцу в’pland_pred’

 library(dplyr)
library(purrr)
library(tibble)
nm1 <- names(pland_pred)[startsWith(names(pland_pred), 'y')]
pland_pred[nm1] <- map(nm1, ~
     pland_pred %>% 
        transmute(!! .x := (lc_names %>%
             select(.x, lc_name) %>% 
             deframe)[as.character(!!rlang::sym(.x))]) %>%
             pull(1))
 

-вывод

 pland_pred
# A tibble: 6 x 12
#     id y2010        y2011        y2012        y2013        y2014        y2015        y2016        y2017        y2018     y2019     pland
#  <int> <chr>        <chr>        <chr>        <chr>        <chr>        <chr>        #<chr>        <chr>        <chr>     <chr>     <dbl>
#1     1 pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12… pland_12… 1    
#2     2 pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12… pland_12… 1    
#3     3 pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12… pland_12… 1    
#4     4 pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12… pland_12… 1    
#5     5 pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12_cr… pland_12… pland_12… 1    
#6     6 pland_03_de… pland_03_de… pland_03_de… pland_03_de… pland_03_de… pland_03_de… pland_03_de… pland_03_de… pland_05… pland_05… 0.125
 

Ответ №2:

В базе R вы можете использовать Map :

 cols <- grep('y\d ', names(pland_pred), value = TRUE)

pland_pred[cols] <- Map(function(x, y) lc_names$lc_name[match(y, x)],
                        lc_names[cols], pland_pred[cols])

pland_pred

# A tibble: 6 x 12
#     id y2010     y2011     y2012     y2013     y2014     y2015    y2016    y2017    y2018   y2019   pland
#  <int> <chr>     <chr>     <chr>     <chr>     <chr>     <chr>    <chr>    <chr>    <chr>   <chr>   <dbl>
#1     1 pland_12… pland_12… pland_12… pland_12… pland_12… pland_1… pland_1… pland_1… pland_… pland_… 1    
#2     2 pland_12… pland_12… pland_12… pland_12… pland_12… pland_1… pland_1… pland_1… pland_… pland_… 1    
#3     3 pland_12… pland_12… pland_12… pland_12… pland_12… pland_1… pland_1… pland_1… pland_… pland_… 1    
#4     4 pland_12… pland_12… pland_12… pland_12… pland_12… pland_1… pland_1… pland_1… pland_… pland_… 1    
#5     5 pland_12… pland_12… pland_12… pland_12… pland_12… pland_1… pland_1… pland_1… pland_… pland_… 1    
#6     6 pland_03… pland_03… pland_03… pland_03… pland_03… pland_0… pland_0… pland_0… pland_… pland_… 0.125