如何在强制数据时使用as.numeric函数获取详细信息?

时间:2016-08-24 15:00:17

标签: r csv

我有一个很大的CSV文件(超过100,000行)。除第一列(即时间)外,此文件应仅包含数值。

但是,当我使用read.csv函数读取文件时,某些数据框变量只包含字符。

我尝试使用as.numeric函数将这些变量转换为数字,然后收到警告消息:

  

警告讯息:

     

强制引入的NAs

我的猜测是CSV文件的写入方式有误。我想解决这个错误,但要做到这一点,我需要知道问题出在哪里。

有没有办法获得更详细的信息为什么(尤其是哪里)as.numeric无法将我的数据转换为数字?

1 个答案:

答案 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