如何在R中使用```purrr:map()`和```mutate_if````将因子转换为字符?

时间:2019-11-13 18:25:56

标签: r dplyr purrr

我正在尝试将列表对象中的因子转换为字符。

我的第一次尝试是将purrr::mapmutate_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"

1 个答案:

答案 0 :(得分:3)

问题是mutate适用于tbl_df/data.framecut_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))