首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将data.frame列从因子转换为字符

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

Stack Overflow用户
提问于 2010-05-18 00:52:03
回答 14查看 696.7K关注 0票数 377

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

代码语言:javascript
复制
> 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-

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

代码语言:javascript
复制
> class(bob$phenotype)
[1] "factor"

Bob的列是因子。因此,例如:

代码语言:javascript
复制
> 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的各个列,并且

代码语言:javascript
复制
bob$phenotype <- as.character(bob$phenotype)

它工作得很好。并且,在输入之后,我可以得到一个data.frame,它的列是字符而不是因子。所以我的问题是:我如何才能自动做到这一点?如何将包含因子列的data.frame转换为包含字符列的data.frame,而无需手动遍历每一列?

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

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2010-05-18 01:21:07

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

代码语言:javascript
复制
bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)

这会将所有变量转换为类"character",如果您只想转换因子,请参见Marek's solution below

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

代码语言:javascript
复制
bob[] <- lapply(bob, as.character)

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

票数 378
EN

Stack Overflow用户

发布于 2010-05-18 06:08:48

要仅替换因子,请执行以下操作:

代码语言:javascript
复制
i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)

在dplyr in version 0.5.0 new function mutate_if was introduced包中

代码语言:javascript
复制
library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob

...and in version 1.0.0 was replaced by across

代码语言:javascript
复制
library(dplyr)
bob %>% mutate(across(where(is.factor), as.character)) -> bob

Package purrr from RStudio提供了另一种选择:

代码语言:javascript
复制
library(purrr)
bob %>% modify_if(is.factor, as.character) -> bob
票数 329
EN

Stack Overflow用户

发布于 2013-03-22 01:40:06

如果您了解因子是如何存储的,就可以避免使用基于应用的函数来实现这一点。这并不意味着应用解决方案不能很好地工作。

因子被构造为与“级别”列表相关联的数字索引。如果您将一个因子转换为数字,就可以看到这一点。所以:

代码语言:javascript
复制
> fact <- as.factor(c("a","b","a","d")
> fact
[1] a b a d
Levels: a b d

> as.numeric(fact)
[1] 1 2 1 3

最后一行中返回的数字对应于因子的级别。

代码语言:javascript
复制
> levels(fact)
[1] "a" "b" "d"

请注意,levels()返回一个字符数组。您可以使用这一事实轻松而简洁地将因子转换为字符串或数字,如下所示:

代码语言:javascript
复制
> fact_character <- levels(fact)[as.numeric(fact)]
> fact_character
[1] "a" "b" "a" "d"

这也适用于数值,前提是您将表达式包装在as.numeric()中。

代码语言:javascript
复制
> num_fact <- factor(c(1,2,3,6,5,4))
> num_fact
[1] 1 2 3 6 5 4
Levels: 1 2 3 4 5 6
> num_num <- as.numeric(levels(num_fact)[as.numeric(num_fact)])
> num_num
[1] 1 2 3 6 5 4
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2851015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档