我正在从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转换为因子?
答案 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
中传递。