我有一个数据框。让我们称他为 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 列(caractacus 国王的法院)的因子水平的索引?不是我需要的。

奇怪的是,我可以手动遍历 bob 的列,然后执行
bob$phenotype <- as.character(bob$phenotype)

这工作正常。而且,在一些输入之后,我可以得到一个 data.frame,它的列是字符而不是因子。所以我的问题是:我怎样才能自动做到这一点?如何将带有因子列的 data.frame 转换为带有字符列的 data.frame 而不必手动遍历每一列?

额外问题:为什么手动方法有效?

最佳答案

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

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

这会将所有变量转换为类“字符”,如果您只想转换因子,请参阅 Marek's solution below

正如@hadley 指出的那样,以下内容更简洁。
bob[] <- lapply(bob, as.character)

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

关于r - 将 data.frame 列从因子转换为字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2851015/

10-12 22:39