【问题标题】:convert all factor columns to character in a data.frame without affecting non-factor columns将所有因子列转换为 data.frame 中的字符而不影响非因子列
【发布时间】:2018-05-17 21:52:17
【问题描述】:

例如,我有一个包含整数列和因子列的 data.frame。

data <- data.frame(
    a = 1:5, 
    b = factor(c("a", "b", "c", "d", "e")), 
    c = factor(c("f", "g", "h", "i", "j")))`

我想将 b 和 c 因子列转换为字符,并将 a 列保持为整数。

我尝试了以下代码:

sapply(data, function(x) {if_else(is.factor(x), as.character(x), x)})

它没有得到结果,而是抛出一个错误:

错误:true 的长度必须为 1(condition 的长度),而不是 5

我知道这可以通过 dplyr 中的 mutate_if 函数来完成。但我仍然想知道为什么我的代码不适用于这种情况。

非常感谢您的任何建议!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    对于那些想使用base R并保留数据框结构而不是lapply的列表的人:

    factor_to_characters = function(x)
    {
        factor_cols = sapply(x, is.factor)
        x[factor_cols] = lapply(x[factor_cols], as.character)
        x   
    }
    

    测试一下:

    > class(iris[, "Species"])
    [1] "factor"
    > 
    > i2 = factor_to_character(iris)
    > class(i2[, "Species"])
    [1] "character"
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      library(tidyverse)
      d <- data.frame(a = 1:5, 
                      b = factor(c("a", "b", "c", "d", "e")), 
                      c = factor(c("f", "g", "h", "i", "j")))
      d %>% glimpse() 
      Observations: 5
      Variables: 3
      $ a <int> 1, 2, 3, 4, 5
      $ b <fctr> a, b, c, d, e
      $ c <fctr> f, g, h, i, j
      
      d %>% 
        mutate_if(is.factor, as.character) %>% 
        glimpse()
      Observations: 5
      Variables: 3
      $ a <int> 1, 2, 3, 4, 5
      $ b <chr> "a", "b", "c", "d", "e"
      $ c <chr> "f", "g", "h", "i", "j"
      

      使用 base R 你可以试试

      d[] <- lapply(d, function(x) if(is.factor(x)) as.character(x) else x)
      

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 2014-01-05
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多