【问题标题】:using mutate_each from dplyr to convert all numeric variables to factor使用 dplyr 中的 mutate_each 将所有数值变量转换为因子
【发布时间】:2026-02-05 23:15:01
【问题描述】:

我正在尝试使用 dplyr 中的 mutate_each 来转换因子中数据集的所有数值变量。

library(dplyr)
data(iris)
tbl_df(iris) ->iris

# I can transform all variables in factor
iris %>% mutate_each(funs(as.factor)) %>% summary
# I can transform some variables in factor
iris %>% mutate_each(funs(as.factor),one_of("Sepal.Length", "Petal.Length")) %>% summary

但我的目标是将所有数值变量转换为因子,所以我尝试这样做:

iris %>% mutate_each(funs(as.factor),sapply(iris,is.numeric)) %>% summary # should be a good way, but it doesn't

再试一次

iris %>% mutate_each(funs(as.factor),one_of(names(iris)[sapply(iris,is.numeric)]))
# Error in one_of(vars, ...) : object 'iris' not found

iris %>% mutate_each(funs(as.factor),names(iris)[sapply(iris,is.numeric)])
#Error in one_of(vars, ...) : object 'iris' not found

# anyway the one_of function dont seems to work in mutate_each
vars<-names(iris)[sapply(iris,is.numeric)]
iris %>%   mutate_each_(funs(as.factor),one_of(c("Petal.Length", "Petal.Width")))
iris %>%   mutate_each_(funs(as.factor),one_of(vars))

# Without %>% This works
mutate_each(iris,funs(as.factor), one_of(c("Petal.Length", "Petal.Width"))) %>% summary

这很奇怪.. 有什么想法吗??

谢谢

【问题讨论】:

  • iris %&gt;% mutate_each(funs(as.factor), which(sapply(., is.numeric))) %&gt;% summary?
  • @jeremycg > iris %>% mutate_each(funs(as.factor), which(sapply(., is.numeric))) %>% 总结 lapply 中的错误(X = X,FUN =有趣,...):对象“。”没找到
  • 为我工作 - 你有 plyr 加载(你不应该)?有最新的dplyr 版本吗?
  • dplyr 0.4.1 和 plyr 1.8.2 ... 均已加载。在一个新的 R 会话中,我测试了这个:library(plyr); library(dplyr); data(iris); iris %&gt;% mutate_each(funs(as.factor), which(sapply(., is.numeric))) %&gt;% summary
  • 是的,尝试更新dplyr - 0.4.3 已经发布,对我来说,这个确切的命令在新会话中有效

标签: r dplyr


【解决方案1】:

今天更好的解决方案应该是:

iris %>% mutate_if(is.numeric,as.factor)

【讨论】:

  • 我们如何过滤包含字符串 width 的列名,然后将这些列转换为因子?
【解决方案2】:

更新了 dplyr 1.06 版及更高版本的答案(在此之前也有一点,但我忘记了版本)

iris %>%
   mutate(across(where(is.numeric) , as.factor))

mutate_if()(和其他)已被 across() 或 mutate 中的 across() / where() 组合取代。

【讨论】: