防止将数字转换为因子

时间:2014-08-22 15:14:47

标签: r

我正在从CSV文件构建表格。最初加载文件时,我需要加载为字符。

datset <- read.csv("outcome-of-care-measures.csv", colClasses = "character")

我有转换包含数字的因子(来自其他堆栈q)的函数

as.numeric.factor <- function(x) {as.numeric(levels(x))[x]}

我用

清理文件
i<-17
datset[datset=="Not Available"]<-NA
datset<-datset[complete.cases(datset[,i]),]
x<- as.numeric.factor(datset[, i])

datset表包含许多我不需要的列,因此我构建了一个新表:

dat <- data.frame(cbind("HospitalName"= datset[,2], "State"= datset[,7],"Rating" = x))                        

我的问题是,即使x是数字,它也会在加载到数据帧时变成一个因子。我可以通过以下方式从调试模式验证这一点:

class(x)
"Numeric"

class(dat[,3])
"Factor"

在后面的代码中,我尝试对“评级”列进行排序,但由于它是一个因素而导致其失败 - 我猜。

我甚至尝试将stringsAsFactors = FALSE添加到read.csv,但这没有效果。

如何在加载到DF时阻止x转换为因子?

1 个答案:

答案 0 :(得分:1)

正如亨里克在评论中解释的那样:

dat <- data.frame(cbind("HospitalName"= datset[,2], "State"= datset[,7],"Rating" = x))

是构建数据框架的一种糟糕方式。 cbind将所有内容转换为矩阵,该矩阵只能保存单个数据类型。因此强制。

最好这样做:

dat <- data.frame(HospitalName = dataset[,2],state = dataset[,7],rating = x)

然而,正如Roland提到的那样,当你在via中读取数据时,你应该能够将这一列指定为数字:

colclasses <- rep("character", 40)
colclasses[7] <- "numeric"

然后在read.csv中传递。