我有一个很大的CSV文件(超过100,000行)。除第一列(即时间)外,此文件应仅包含数值。
但是,当我使用read.csv
函数读取文件时,某些数据框变量只包含字符。
我尝试使用as.numeric
函数将这些变量转换为数字,然后收到警告消息:
警告讯息:
强制引入的NAs
我的猜测是CSV文件的写入方式有误。我想解决这个错误,但要做到这一点,我需要知道问题出在哪里。
有没有办法获得更详细的信息为什么(尤其是哪里)as.numeric
无法将我的数据转换为数字?
答案 0 :(得分:1)
如果您提供了reproducible example,这会有所帮助。既然你没有,我会尝试制作一个。希望这是值得的。
write.csv(read.table(text="A 1 2 3
B 2 3 4
C 3 4 5
D 4 5 6
E 5 q 7
F 6 7 8
G 7 8 9", header=F, stringsAsFactors=F), file="file.csv", row.names=F)
此文件应该使用数字变量打开(第一列除外),但第三列在某处搞砸了:
my.data <- read.csv("file.csv", stringsAsFactors=F, header=T)
str(my.data)
# 'data.frame': 7 obs. of 4 variables:
# $ V1: chr "A" "B" "C" "D" ...
# $ V2: int 1 2 3 4 5 6 7
# $ V3: chr "2" "3" "4" "5" ...
# $ V4: int 3 4 5 6 7 8 9
您可以尝试的一件事是一次读取一行文件,并查看有问题的变量的类何时从数字切换:
for(i in 1:7){
row <- read.csv("file.csv", stringsAsFactors=F, header=T, skip=i-1, nrows=1)
if(is.character(row[1,3])){ break() }
}
i # [1] 5
row[1,3] # [1] "q"
发现了罪魁祸首(或至少是第一个),您可以在Excel中打开文件,或类似EditPad之类的内容,然后导航到坏元素并修复它。 (务必对文件的副本执行此操作;保留原始疣和所有 - 以获取永久记录。)
编辑:
如果您已经拥有NA
s的向量,则可以找到它们的位置:
which(is.na(as.numeric(my.data[,3])))
# [1] 5
# Warning message:
# In which(is.na(as.numeric(my.data[, 3]))) : NAs introduced by coercion
或者直接跳到检查元素:
my.data[which(is.na(as.numeric(my.data[,3]))),3]
# [1] "q"
# Warning message:
# In which(is.na(as.numeric(my.data[, 3]))) : NAs introduced by coercion