读入并将许多CSV文件合并到data.table

时间:2016-02-26 14:31:45

标签: r csv data.table eval

我有很多.csv个文件,其中包含相同“人口”的变量,由surnamefirst.name键入。 所以每个csv都有三列:名字,姓氏和感兴趣的变量。 我将它们中的每一个加载到单独的数据表中,然后我想合并它们。

library(data.table)
surnames <- c('A', 'B')
first.names <- c('C', 'D')
weights <- c(80, 90)
heights <- c(180, 190)

write.csv(data.frame(surname = surnames, first.name = first.names, 
                     height = heights), file = 'variable-height.csv')
write.csv(data.frame(surname = surnames, first.name = first.names,  
                     weight = weights), file = 'variable-weight.csv')

variables.to.load <- c('height', 'weight')
for (i in variables.to.load) {
assign(paste0('DT.', i), fread(paste0('variable-', i, '.csv')))
print(dim(eval(parse(text = paste0('DT.', i)))))
setkey(eval(parse(text = paste0('DT.', i))), surname, first.name)
}

加载它们并正确设置键。 但我缺少的是自动合并。

DT.merged <- Reduce(merge, list(DT.height, DT.weight))

有效,但我想以自动方式完成,因为实际变量更多。也就是说,我想以自动方式编写list()DT.heightDT.weight等内容。

我试过了:

library('stringr')
DT.merged <- Reduce(merge, list(eval(parse(text = str_c(paste0('DT.', variables.to.load), collapse = ', ')))))

没有结果。

我做了整个过程,因为我想有选择地为我的人口提供不同的变量(总计为超过30GB的csv和大约30个变量)。因此,在完整fread上使用csv来有选择地读取列似乎相当慢。

1 个答案:

答案 0 :(得分:2)

这适用于你的问题

DTlist <- lapply(paste0('variable-', variables.to.load, '.csv'), 
    function(x) {
       d <- fread(x) 
       setkey(d, surname, first.name)
       d
     }
   )
DT.merged <- Reduce(merge, DT)

话虽如此,正如Roland和我在评论中提到的那样,如果您可以访问包含所有所需数据的单个CSV文件,这不太可能是最佳方法。

如果您确实可以访问此类文件,则最好使用select

fread参数
DT <- fread('master.csv', select=c(variables.to.load))