我在这里找不到与我提出的问题类似的问题。我有一个非常大的命名向量列表,这些向量的名称与数据帧中的列名匹配。我想使用命名向量列表来替换与每个列表元素名称相匹配的数据帧列中的值。也就是说,列表中向量的名称与数据帧列的名称匹配,并且每个向量元素中的键-值对将用于重新编码该列。
以下是示例:
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
我想使用列表中的名称重新编码列,而不删除列。
dplyr::across()
与dplyr::cur_column()
的组合效果最佳。谢谢! - Hersh Guptamatching_vars <- na.omit(names(dicts[names(test)]))
,然后将其传递给across()
中的第一个参数。 - Hersh Gupta