R dplyr在访问colnames时发生变异

R dplyr在访问colnames时发生变异,r,dplyr,mutate,R,Dplyr,Mutate,如何访问dplyr::mutate_在处处理的列名 假设我们想将数据帧的一列转换为因子,其级别存储在单独的列表中 df <- data.frame("C1"=c("A","B","C"), "C2"=c("D","E","F")) df C1 C2 1 A D 2 B E 3 C F lst <- list(

如何访问
dplyr::mutate_在
处处理的列名

假设我们想将数据帧的一列转换为因子,其级别存储在单独的列表中

df <- data.frame("C1"=c("A","B","C"), "C2"=c("D","E","F"))
df
  C1 C2
1  A  D
2  B  E
3  C  F

lst <- list("C2"=c("F","E","D"), "C3"=c("G","H","I"))
lst
$C2
[1] "F" "E" "D"

$C3
[1] "G" "H" "I"

使用
intersect
获取公共列后,您可以在基本R中使用
Map
,也可以从
purrr
中使用
Map

cols <- intersect(names(lst), names(df))
df[cols] <- Map(function(x, y) factor(x, levels = y), df[cols], lst[cols])

cols
mutate_at
已被
dplyr
v1.0.0中的
cross
功能性所支持。这是你的选择吗?不幸的是,这对我来说不是一个选择。然而,我现在需要坚持使用
dplyr
(或者至少使用管道)这里不需要管道,但是如果你坚持要使用
df[cols]%map2(lst[cols],~factor(.x,levels=.y))
工作?我的意思是从整个
df
管道,而不是用
df[cols]
@u31889抱歉,我不知道有什么
dplyr
方法可以做到这一点(我怀疑它是否存在)。在阅读了你的问题后,这种方法对我来说似乎更自然,因此我把它作为一个答案贴了出来。使用
dplyr
可能有一种非常复杂的方法,如果您找到了,请将其作为答案发布。
cols <- intersect(names(lst), names(df))
df[cols] <- Map(function(x, y) factor(x, levels = y), df[cols], lst[cols])
df[cols] <- purrr::map2(df[cols], lst[cols], ~factor(.x, levels = .y))