【发布时间】:2014-04-20 10:42:17
【问题描述】:
我有一个存储为 .csv 文件的巨大数据集,它不适合内存。但是,我只需要数据集中适合内存的 3 列。如何加载它们?
更新: 我可以按名称而不是按列索引选择列吗?我不知道他们的指数先验
【问题讨论】:
-
您可以查看链接:stackoverflow.com/questions/5788117/… 我已经发布了另一个解决方案。
我有一个存储为 .csv 文件的巨大数据集,它不适合内存。但是,我只需要数据集中适合内存的 3 列。如何加载它们?
更新: 我可以按名称而不是按列索引选择列吗?我不知道他们的指数先验
【问题讨论】:
如果您的表非常大,请考虑使用data.table 包:
# create an example: 10,000 rows by 100 columns
df <- data.frame(matrix(rnorm(1e6),ncol=100))
write.csv(df,"sample.csv",row.names=F)
library(data.table)
dt <- fread("sample.csv",select=c(3,8,20))
head(dt)
# X3 X8 X20
# 1: 0.5537762 1.0271272 -0.14437400
# 2: -0.4111327 -0.2297311 -1.04998490
# 3: -1.2540440 0.6977565 -0.21514021
# 4: -1.1500974 -0.3181102 -0.07910133
# 5: -0.6549245 1.8385510 0.73741980
# 6: 0.8049360 0.4722533 -0.65750679
这仅读取第 3、8 和 20 列,速度非常快。
【讨论】:
您可以在加载到 R 之前使用 awk 进行预处理吗?如果是这样,假设您想要第 2,3 和 5 列,您可以这样做:
awk '{print $2,$3,$5}' yourfile.csv > cols23and5.csv
如果您的 CSV 文件被引用(例如,因为某些字段包含逗号),并且看起来像这样:
"Field 1","Field 2, with commas, in it","Field 3","Field 4, also with commas,,,"
"Field 1","Field 2, with commas, in it","Field 3","Field 4, also with commas,,,"
您可以删除双引号并将字段分隔符从逗号更改为冒号,如下所示:
sed -e 's/","/:/g' -e 's/"//g' yourfile.csv > ColonSeparated.csv
让你的文件变成:
Field 1:Field 2, with commas, in it:Field 3:Field 4, also with commas,,,
Field 1:Field 2, with commas, in it:Field 3:Field 4, also with commas,,,
然后您可以使用冒号作为分隔符使用awk 处理它,而无需担心嵌入的逗号:
awk -F: '{print $2,FS,$3,FS,$4}' ColonSeparated.csv > SmallFileForR.csv
【讨论】:
在 linux 上,给 'awk' 机会。 它像寄存器一样操作文件。
您可以查看Using AWK on CSV Files 了解一些策略。
【讨论】: