如何使用图例中的匹配值更新数据集的值?
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
我有一个带有键和多个列的“图例”:
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