将data.frame列从因素转换为字符

我有一个数据框。 让我们叫他bob

> head(bob)
                 phenotype                         exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

我想连接这个数据框的行(这将是另一个问题)。 但看:

> class(bob$phenotype)
[1] "factor"

Bob的专栏是因素。 所以,例如:

> as.character(head(bob))
[1] "c(3, 3, 3, 6, 6, 6)"       "c(3, 3, 3, 3, 3, 3)"      
[3] "c(29, 29, 29, 30, 30, 30)"

我并没有开始理解这一点,但我想这些是bob的国王柱(卡拉库卡球场)柱子因素水平的指标? 不是我需要的。

奇怪的是,我可以手工通过bob的列,然后做

bob$phenotype <- as.character(bob$phenotype)

这工作正常。 而且,在打字后,我可以得到一个data.frame,其列是字符而不是因素。 所以我的问题是:我怎么能自动做到这一点? 如何将具有因子列的data.frame转换为包含字符列的data.frame,而无需手动通过每列?

奖金问题:为什么手动方法有效?


接下来是马特和德克。 如果您想在不更改全局选项的情况下重新创建现有数据框,可以使用apply语句重新创建它:

bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)

这将把所有变量转换为类“字符”,如果您只想转换因子,请参见下面的Marek解决方案。

正如@hadley指出的那样,以下内容更加简洁。

bob[] <- lapply(bob, as.character)

在这两种情况下, lapply输出一个列表; 然而,由于R的神奇属性,在第二种情况下使用[]保留了bob对象的data.frame类,从而消除了使用as.data.frame转换回data.frame的需要as.data.frame参数stringsAsFactors = FALSE


仅替换因素:

i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)

在0.5.0版的包dplyr中,引入了新的函数mutate_if

library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob

来自RStudio的套餐提供了另一种选择:

library(purrr)
library(dplyr)
bob %>% map_if(is.factor, as.character) %>% as_data_frame -> bob

(记住它是新鲜的包装)


全球选项

stringsAsFactors:data.frame和read.table参数的默认设置。

可能是你想在启动文件中设置为FALSE东西(例如〜/ .Rprofile)。 请参阅help(options)

链接地址: http://www.djcxy.com/p/12223.html

上一篇: Convert data.frame columns from factors to characters

下一篇: Best way to create generic/method consistency for sort.data.frame?