我正在尝试将numeric
和character
类变量批量转换为R中的factor
。我觉得这应该很简单,但我遇到的问题实际上是因子
我所做的就是:
>sapply(df, class)
a b c
"numeric" "numeric" "numeric"
>col.names <- c("a", "b", "c")
>df[,col.names] <- sapply(df[,col.names], as.factor)
我得到了这个:
>sapply(df, class)
a b c
"character" "character" "character"
我试图找出为什么它不会从数字转换为因子,而是转向角色。
通常问题是从因素到数字,所以我还没有找到关于此类问题的任何信息。
答案 0 :(得分:1)
我想,在这种情况下,sapply()
会返回一个矩阵,这不是一个因素。使用
df[,col.names] <- lapply(df[,col.names], as.factor)
因为lapply()
会返回将它们插入df的因子列表。
答案 1 :(得分:1)
您必须使用lapply
。在下面的示例中,我创建了两个相等的df,包含4列。
df <- df2 <- data.frame(a = 1:5, b = 6:10, c = 11:15, d = 16:20)
col.names <- c("a", "b", "c")
df[,col.names] <- lapply(df[,col.names], as.factor)
sapply(df, class)
#a b c d
#"factor" "factor" "factor" "integer"
请注意,如果要更改整个data.frame,则需要编写方括号df2[]
。
df2[] <- lapply(df2, as.factor)
sapply(df2, class)
#a b c d
#"factor" "factor" "factor" "factor"
答案 2 :(得分:0)
尝试类似:
df <- data.frame(sapply(df, as.factor))
不同之处在于它最后将它包含在data.frame中。
答案 3 :(得分:0)
这是一个tidyverse
解决方案。
library(tidyverse)
data <- tibble(x = c("blue", "green", y = c(1:2))
data <- data %>%
mutate(x = factor(x),
y = factor(y))