读入许多 CSV 文件并将其合并到 data.table
Read in and merge many CSV files into data.table
我有很多 .csv
文件,包含相同 "population" 的变量,由 surname
和 first.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.height
、DT.weight
等
我试过:
library('stringr')
DT.merged <- Reduce(merge, list(eval(parse(text = str_c(paste0('DT.', variables.to.load), collapse = ', ')))))
没有结果。
我完成了整个过程,因为我想为我的人口有选择地使用不同的变量(总计超过 30GB 和大约 30 个变量的 csv)。因此,在完整 csv
上使用 fread
来有选择地读取列似乎相当慢。
这应该可以解决您的问题
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 文件,这不太可能是最佳方法。
如果您确实有权访问此类文件,最好使用 fread
的 select
参数
DT <- fread('master.csv', select=c(variables.to.load))
我有很多 .csv
文件,包含相同 "population" 的变量,由 surname
和 first.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.height
、DT.weight
等
我试过:
library('stringr')
DT.merged <- Reduce(merge, list(eval(parse(text = str_c(paste0('DT.', variables.to.load), collapse = ', ')))))
没有结果。
我完成了整个过程,因为我想为我的人口有选择地使用不同的变量(总计超过 30GB 和大约 30 个变量的 csv)。因此,在完整 csv
上使用 fread
来有选择地读取列似乎相当慢。
这应该可以解决您的问题
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 文件,这不太可能是最佳方法。
如果您确实有权访问此类文件,最好使用 fread
select
参数
DT <- fread('master.csv', select=c(variables.to.load))