R意外地将字段从CSV文件转换为NA

时间:2015-11-28 22:05:52

标签: r

我正在尝试解析R中的CSV文件。以下是带有分隔符~的CSV文件的第一行。请注意第二个字段位置的i字面值。

2015-10-29 18:49:42~i~186.37.108.44~Mozilla/5.0 (Linux; Android 4.1.2; GT-S6810E Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36~ea01627ed45116787d3b1c0224a44d77~?~CL~1443~219~729~335~3155~9214~5

以下是我试图解析它的方法:

> parsed <- read.csv('i.csv', header=F, sep='~')
> parsed$V2
  [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [37] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [73] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[109] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[145] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[181] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[217] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[253] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[289] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> table(count.fields('i.csv', sep='~'))

 14 
310 

为什么会这样?为什么字段#2是NA而不是i?所有其他字段都可以,字段#1和字段#3不包含i字面值。所有其他字段也可以。

> df$V1[1]
[1] 2015-10-29 18:38:04
257 Levels: 2015-10-29 18:38:04 2015-10-29 18:38:07 2015-10-29 18:38:12 ... 2015-10-29 18:51:46
> df$V3[1]
[1] 24.237.158.3
270 Levels: 1.144.97.1 1.187.195.221 1.187.204.84 1.39.12.184 1.39.13.227 1.39.137.12 1.39.33.86 ... 97.44.1.207

1 个答案:

答案 0 :(得分:1)

为了完成,我将我的评论添加为答案。

R中的几乎所有读取函数(read.csvread.csv2dataread.fwfunzipread.delim)都会调用{{ 1}}内部功能。

如果read.table没有提供函数调用,read.table会调用type.convert来回收colClasses

来自R docstype.convert,它说

  

这主要是read.table的辅助函数。给定一个字符向量,它会尝试将其转换为逻辑,整数,数字或复数,并且失败会将其转换为因子,除非as.is = TRUE。选择可接受所有非缺失值的第一种类型。

因此,type.convert按此特定顺序检查值是逻辑,整数,实数还是复数,如果排除所有这些选项,则将值转换为factor(或as.is=T时的字符) 。

在R-3.2.1中,(buggystrtoc以及可能typeconvert的实施导致i转换为NAstrtoc已在R-3.3.0中得到纠正。

在R-3.3.0中,type.convert('n±ki')仅在k≠1时返回复数。

来自Changes in R-3.3.0

  

type.convert("i")现在返回一个因子,而不是一个复数值,零实部和虚部缺失。