我正在尝试使用fread包中的data.table从制表符分隔的文件中加载少量字段,并使用更多未使用的字段。

为此,我使用了select选项,该选项非常适合在列中阅读。

但是,当我未指定各个字段的类时,自动选择器将不起作用(大多数/所有数字变量最终都被读取为1.896916e-316之类的数字小数字)。

为了解决这个问题,我的第一个直觉是将代码更改为:

DT <- fread("data.txt", select = c ("V1", "V2", ..., "Vn"))


DT <- fread("data.txt", select = c("V1", "V2", ..., "Vn"),
            colClasses = c("numeric", ..., "character"))

即,将select字符向量与等长的colClasses字符向量匹配,(显然)从选择集中选择的第i个选定字段的类型等于colClasses的第i个元素。

但是,fread似乎不喜欢这样-即使使用selectcolClasses仍希望字符向量具有与WHOLE文件一样多的字段:

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

最佳答案

实际上,通过仔细阅读ojit_dwle先生对drop / select / colClasses选项的图示,找到了一种解决方案:

DT <- fread("data.txt", select = c("V1", "V2", "V3"),
            colClasses = list(character = c("char_names"),
                              factor = c("factor_names"),
                              numeric = c("numeric_names")))

我以前没有意识到这一点,因为由于我的.csv文件格式错误,我的fread尝试还有其他问题。

不过,我不会称其为自然方法无效的错误:
DT <- fread("data.txt", select = c("V1", ..., "Vn"),
            colClasses = c("type1", ..., "typen"))

08-20 00:52