我有一个巨大的数据集存储为.csv文件,它不适合内存。但是,我只需要数据集中的3列,这些列适合内存。我该如何加载它们?
UPD: 我可以按名称而不是按列索引选择列吗?我不知道他们的指数是先验的
答案 0 :(得分:3)
你可以在加载到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
答案 1 :(得分:2)
如果您的表格非常大,请考虑使用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列,速度非常快。
答案 2 :(得分:0)
您可以查看Using AWK on CSV Files的某些策略。