我有几个星期使用 ff 包,到目前为止它工作得很好,但是今天我意识到应该是数字的变量被读取为一个因素。数据有大约 900k 行和 800 列,所以要控制每一列都得到它应该得到的类并不容易......
matff <- read.csv2.ffdf(file = name,encoding = "UTF-8",next.rows=150000,colClasses=NA)
我想知道为什么会发生这种情况以及如何解决它的想法。
谢谢。
现在它应该可以工作了:
# matff <- data.frame(Col=c('a','b','c'),Mix1=c('a','1.2','c'),Mix2=c(1.1,2.1,3),Num1=c('1.2','2.3','3.4'),Num2=c('1,2','2,3','3,4')) # Data example
func <- function(x) {
if (class(x) != 'numeric') {
x <- levels(x)[x]
if (length(grep('[a-zA-Z]',x,invert=T)) == length(x)) { x <- as.real(gsub(',','\\.',x)) }
else { x <- factor(x) }
}
x
}
for (i in 1:ncol(matff)) {
matff[,i] <- func(matff[,i])
}
您的数据有一些列显然是文本,而不是您期望的数字数据。
您可以使用 transFUN 参数 read.csv2.ffdf 来解决您的小数问题。如在
transFUN=function(x){
x$mycolumn <- as.numeric(gsub(",", ".", as.character(x$mycolumn)))
x
}
或者使用适当的 read.table 参数。