将所有因子列转换为data.frame中的字符,而不会影响非因子列

时间:2017-12-04 12:18:55

标签: r dataframe

例如,我有一个包含整数列和因子列的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函数来完成。但我仍然想知道为什么我的代码不适合这种情况。

非常感谢您的任何建议!

2 个答案:

答案 0 :(得分:6)

您可以尝试:

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)

答案 1 :(得分:0)

对于那些想要使用基础 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"