我正在尝试将列表对象中的因子转换为字符。
我的第一次尝试是将purrr::map
与mutate_if(is.factor,as.character)
组合使用,但这没有用。我在错误消息中搜索了Google,但没有找到问题的答案。
我求助于base::lapply
来完成工作(并且确实做到了)。
但是,我无法通过purrr::map
方法发现错误。
这是怎么了?
以下代码是我所遇到的情况的有效示例。
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(purrr)
a_matrix = matrix(data = sample(100,100, replace = T),nrow = 10)
a_df = data.frame(a_matrix)
cut_modif = function(x) {
cut(x,
breaks = quantile(x),
labels = c("A", "B", "C", "D"),
include.lowest = T,
right = T
)
}
# This one works
myResults = map(a_df,cut_modif)
myResults = lapply(myResults, as.character)
# This one DOES NOT work
myResults = map(a_df,cut_modif) %>%
map(mutate_if(is.factor, as.character))
#> Error in UseMethod("tbl_vars"): no applicable method for 'tbl_vars' applied to an object of class "function"
答案 0 :(得分:3)
问题是mutate
适用于tbl_df/data.frame
,cut_modif
的输出是vector
,因此从本质上讲,它是{{1 }},为此可以使用list
vectors
如果我们仍然想使用map_if
,请转换为data.frame / tbl_df,然后应用
library(dplyr)
library(purrr)
map(a_df,cut_modif) %>%
map_if(is.factor, as.character)
另外,请注意,通过使用匿名函数调用(mutate
),可以避免多次调用map(a_df, ~ cut_modif(.x) %>%
tibble(cutCol = .) %>%
mutate_if(is.factor, as.character))