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])
colsmutate_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))