如何使用图例中的匹配值更新数据集的值?

How do I update the values of a dataset using matched values in a legend?

我有一个带有键和多个列的“图例”:

library(dplyr)

(legend <- tibble(key = 1:3, 
               value_1 = c("x", "y", "z"),
               value_2 = c("fg", "d", "f"),
               value_3 = c("dsf", "sdf", "sdf")))
#> # A tibble: 3 × 4
#>     key value_1 value_2 value_3
#>   <int> <chr>   <chr>   <chr>  
#> 1     1 x       fg      dsf    
#> 2     2 y       d       sdf    
#> 3     3 z       f       sdf

在我的真实数据中,我有相同的列,但它们采用图例键的值。

(data = tibble(value_1 = c(1, 3, 3),
              value_2 = c(2, 2, 2),
              value_3 = c(1, 2, 3)))
#> # A tibble: 3 × 3
#>   value_1 value_2 value_3
#>     <dbl>   <dbl>   <dbl>
#> 1       1       2       1
#> 2       3       2       2
#> 3       3       2       3

是否可以通过使用图例“更新”我的数据集的方式将我的数据集匹配在一起?

# expected output
  tibble(value_1 = c("x", "z", "z"),
         value_2 = c("d", "d", "d"),
         value_3 = c("dsf", "sdf", "sdf"))
#> # A tibble: 3 × 3
#>   value_1 value_2 value_3
#>   <chr>   <chr>   <chr>  
#> 1 x       d       dsf    
#> 2 z       d       sdf    
#> 3 z       d       sdf

reprex package (v2.0.1)

创建于 2022-06-02

由于这些是'data'列的位置索引,循环across'legend'的'value_'列,根据列名得到对应的列(cur_column()) 来自 'data',将其用作数字索引以对 'legend' 列的值进行子集化

library(dplyr)
legend <- legend %>% 
   mutate(across(starts_with('value_'), ~ .x[data[[cur_column()]]]))

-输出

legend
# A tibble: 3 × 4
    key value_1 value_2 value_3
  <int> <chr>   <chr>   <chr>  
1     1 x       d       dsf    
2     2 z       d       sdf    
3     3 z       d       sdf    

您也可以使用 purrr。这应该比 mutate() 更快,但也假定值的键控等于它们的行号。

library(purrr)

map_dfc(set_names(names(data)),
        ~ legend[[.x]][data[[.x]]])
# A tibble: 3 x 3
  value_1 value_2 value_3
  <chr>   <chr>   <chr>  
1 x       d       dsf    
2 z       d       sdf    
3 z       d       sdf