【发布时间】:2017-08-16 12:24:54
【问题描述】:
我将一些结果放入数据框中。我有一些因子列和许多数字列。根据this问题的答案,我可以通过索引轻松地将数字列转换为数字。
#create example data
df = data.frame(replicate(1000,sample(1:10,1000,rep=TRUE)))
df$X1 = LETTERS[df$X1]
df$X2 = LETTERS[df$X2]
df$X3 = LETTERS[df$X3]
df[-1] <- sapply(df[-1], function(x) ifelse(runif(length(x)) < 0.1, NA, x))
#find columns that are factors
factornames = c("X1", "X2", "X3")
factorfilt = names(df) %in% factornames
#convert non-factor columns to numeric
df[, !factorfilt] = as.numeric(as.character(unlist(df[, !factorfilt])))
但是当我想对我的因子列做同样的事情时,我无法让相同的索引工作:
#convert factor columns to factor
df[, factorfilt] = as.factor(as.character(unlist(df[, factorfilt])))
class(df$X1)
[1] "character"
df[, factorfilt] = as.factor(as.character(df[, factorfilt]))
class(df$X1)
[1] "character"
df[, factorfilt] = as.factor(unlist(df[, factorfilt]))
class(df$X1)
[1] "character"
df[, factorfilt] = as.factor(df[, factorfilt])
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?
如果我调用class(df$X1),所有这些都返回"character",而如果我运行df$X1= as.factor(df$X1),它会返回"factor"。
为什么当我调用 as.factor 时这种索引方式不起作用,但如果我调用 as.numeric 时会起作用?
【问题讨论】:
-
as.factor或as.character等适用于vector而不是data.frame。您需要遍历列,然后执行factor -
根据 akrun 的评论,使用
lapply遍历选定的列并执行强制转换:df[, factorfilt] <- lapply(df[, factorfilt], as.factor)。 -
numeric是一种原子数据类型,而 factor 是一种将标签映射到整数并具有自己的类的特殊数据类型。data.frame有自己的类,尝试将as.factor(unlist(df[, factorfilt]))中的值(这是一个因素)重新分配到 data.frame 的多个列中,导致函数在重新分配之前将未列出的向量转换为字符。涉及的功能比较复杂,输入`[<-.data.frame`查看。剥离因子类并转换为字符的行可能是value <- matrix(value, n, p),因为矩阵有自己的类。 -
一般来说,
mutate_if是将一种类型的所有列转换为另一种类型的好方法。 -
关于尝试使用因子矩阵的非常详细的回复:stackoverflow.com/questions/28723059/…。从那个答案来看,当您使用
matrix(...)时,它会在构建矩阵之前对数据使用as.vector()。这就是将因子转换为字符的原因(试试class(as.vector(factor(c(1,2,3)))))
标签: r dataframe indexing types