我正在尝试解析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
答案 0 :(得分:1)
为了完成,我将我的评论添加为答案。
R中的几乎所有读取函数(read.csv
,read.csv2
,data
,read.fwf
,unzip
,read.delim
)都会调用{{ 1}}内部功能。
如果read.table
没有提供函数调用,read.table
会调用type.convert
来回收colClasses
。
来自R docs的type.convert
,它说
这主要是read.table的辅助函数。给定一个字符向量,它会尝试将其转换为逻辑,整数,数字或复数,并且失败会将其转换为因子,除非
as.is = TRUE
。选择可接受所有非缺失值的第一种类型。
因此,type.convert
按此特定顺序检查值是逻辑,整数,实数还是复数,如果排除所有这些选项,则将值转换为factor(或as.is=T
时的字符) 。
在R-3.2.1中,(buggy)strtoc
以及可能typeconvert
的实施导致i
转换为NA
。 strtoc
已在R-3.3.0中得到纠正。
在R-3.3.0中,type.convert('n±ki')
仅在k≠1时返回复数。
type.convert("i")
现在返回一个因子,而不是一个复数值,零实部和虚部缺失。