我有个数据框。我们叫他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,而无需手动遍历每一列?
奖励问题:为什么手动方法有效?
发布于 2010-05-18 01:21:07
只是跟着马特和德克。如果要在不更改全局选项的情况下重新创建现有数据框,可以使用apply语句重新创建它:
bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)
这会将所有变量转换为类"character",如果您只想转换因子,请参见Marek's solution below。
正如@hadley指出的那样,下面的内容更简洁。
bob[] <- lapply(bob, as.character)
在这两种情况下,lapply
都输出一个列表;但是,由于R的神奇属性,在第二种情况下使用[]
保留了bob
对象的data.frame类,从而消除了使用带有参数data.frame的as.data.frame
转换回stringsAsFactors = FALSE
的需要。
发布于 2010-05-18 06:08:48
要仅替换因子,请执行以下操作:
i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)
在dplyr in version 0.5.0 new function mutate_if
was introduced包中
library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob
...and in version 1.0.0 was replaced by across
library(dplyr)
bob %>% mutate(across(where(is.factor), as.character)) -> bob
Package purrr from RStudio提供了另一种选择:
library(purrr)
bob %>% modify_if(is.factor, as.character) -> bob
发布于 2013-03-22 01:40:06
如果您了解因子是如何存储的,就可以避免使用基于应用的函数来实现这一点。这并不意味着应用解决方案不能很好地工作。
因子被构造为与“级别”列表相关联的数字索引。如果您将一个因子转换为数字,就可以看到这一点。所以:
> 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
最后一行中返回的数字对应于因子的级别。
> levels(fact)
[1] "a" "b" "d"
请注意,levels()
返回一个字符数组。您可以使用这一事实轻松而简洁地将因子转换为字符串或数字,如下所示:
> fact_character <- levels(fact)[as.numeric(fact)]
> fact_character
[1] "a" "b" "a" "d"
这也适用于数值,前提是您将表达式包装在as.numeric()
中。
> 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
https://stackoverflow.com/questions/2851015
复制相似问题