【发布时间】:2022-01-16 15:10:12
【问题描述】:
我找不到与我在这里遇到的问题类似的问题。我有一个非常大的命名向量的命名列表,它们与数据框中的列名匹配。我想使用命名向量列表来替换与每个列表元素的名称匹配的数据框列中的值。也就是说,列表中向量的名称与数据框列的名称匹配,并且每个向量元素中的键值对将用于重新编码列。
下面的例子:
library(tidyverse)
# Starting tibble
test <- tibble(Names = c("Alice","Bob","Cindy"),
A = c(3,"q",7),
B = c(1,2,"b"),
C = c("a","g",9))
# Named vector
A <- c("5" = "alpha", "7" = "bravo", "3" = "charlie", "q" = "delta")
B <- c("1" = "yes", "2" = "no", "b" = "bad", "c" = "missing")
C <- c("9" = "beta", "8" = "gamma", "a" = "delta", "g" = "epsilon")
# Named list of named vectors
dicts <- list("A" = A, "B" = B, "C" = C) # Same names as columns
我可以使用mutate 并手动指定列和列表项。
# Works when replacement vector is specified
test %>%
mutate(across(c("A"),
~recode(., !!!dicts$A)))
#> # A tibble: 3 x 4
#> Names A B C
#> <chr> <chr> <chr> <chr>
#> 1 Alice charlie 1 a
#> 2 Bob delta 2 g
#> 3 Cindy bravo b 9
但是,以下方法不起作用:
# Does not work when replacement vector using column names
test %>%
mutate(across(c("A", "B", "C"),
~recode(., !!!dicts$.)))
错误:
mutate()输入..1有问题。 x 不提供替代品。 i 输入..1是(function (.cols = everything(), .fns = NULL, ..., .names = NULL) ...。
此外,我发现map2_dfr 仅在指定所有未重新编码的列时才有效:
# map2_dfr Sort of works, but requires dropping some columns
map2_dfr(test %>% select(names(dicts)),
dicts,
~recode(.x, !!!.y))
#> # A tibble: 3 x 3
#> A B C
#> <chr> <chr> <chr>
#> 1 charlie yes delta
#> 2 delta no epsilon
#> 3 bravo bad beta
我希望使用列表中的名称重新编码列,而不删除列。
【问题讨论】: