我将使用data.table软件包中的fread功能从一个包含许多未使用字段的制表符分隔文件中加载少量字段。为此,我将使用select选项,该选项可读入列。然而,如果我不指定各个字段的类别,则自动选择器无法工作(大部分/全部数值变量最终被读入为数值微小的数字,例如1.896916e-316)。为了解决这个问题,我的第一个直觉是将代码从以下方式更改:
即,将
任何改进这个页面的建议吗?这是数据的预览参考:
DT <- fread("data.txt", select = c ("V1", "V2", ..., "Vn"))
to
DT <- fread("data.txt", select = c("V1", "V2", ..., "Vn"),
colClasses = c("numeric", ..., "character"))
即,将
select
字符向量与相同长度的colClasses
字符向量匹配,显然从所选集合中选择的第i个字段的类型等于colClasses
的第i个元素。
然而,即使使用select
,fread
似乎并不喜欢这样做,colClasses
仍需要一个具有与整个文件一样多字段的字符向量:
Error in
fread("data.txt", select = c("V1", "V2", ..., "Vn",
:colClasses
未命名且长度为25但有256列。请参见?data.table
了解colClasses
用法。
如果我只需在一个文件上执行此操作,那么这可能是可以接受的——我会简单地使用"character"
(或者其他类型)填充其余的字符向量,因为它们被抛弃了。
然而,我计划在与其他年份对应的文件上重复此过程13次左右——它们具有相同的列名称,但可能以不同的顺序出现(并且每年的列数也不同),这破坏了循环性(以及需要更长的时间)。
以下方法可行,但从编码角度来看并不高效:
DT <- fread("data.txt", select=c("V1", "V2", "V3"),
colClasses = c(V1 = "factor", V2 = "character", V3 = "numeric"))
这很麻烦,因为我正在使用25列,所以需要大量的代码来指定列类型。我无法利用rep
来节省空间,例如:
colClasses = c(rep("character", times = 3), rep("numeric", times = 20))
任何改进这个页面的建议吗?这是数据的预览参考:
LEAID FIPST NAME SCHLEV AGCHRT CCDNF GSLO V33 TOTALREV TFEDREV
1: 0100002 01 ALABAMA YOUTH SERVICES N 3 1 03 0 -2 -2
2: 0100005 01 ALBERTVILLE CITY 03 3 1 PK 4143 38394000 6326000
3: 0100006 01 MARSHALL COUNTY 03 3 1 PK 5916 58482000 11617000
4: 0100007 01 HOOVER CITY 03 3 1 PK 13232 154703000 10184000
5: 0100008 01 MADISON CITY 03 3 1 PK 8479 89773000 6648000
---
18293: 5680180 56 NORTHEAST WYOMING BOCES 07 3 1 N -2 -2 -2
18294: 5680250 56 REGION V BOCES 07 3 1 N -2 -2 -2
18295: 5680251 56 WYOMING DEPARTMENT OF FAMILY SERVICES 02 3 1 KG 82 -2 -2
18296: 5680252 56 YOUTH EMERGENCY SERVICES, INC. - ADMINISTRATION OFFICE N 3 1 07 29 -1 -1
18297: 5680253 56 WYOMING BEHAVIORAL INSTITUTE N N 1 01 0 -2 -2