我有相当多的非常重的数据集。我想从每个中提取一个子集并将其保存到不同的csv文件中(每个数据集一个)。这些是我想为文件夹中的所有文件循环的命令:
df <-read.csv("1985.csv",header=FALSE,stringsAsFactors=TRUE,sep="\t")
df_short <- df[df$V6=="OPP", ]
write.csv(df_short, file = "OPP_1985.csv",row.names=FALSE)
rm(df)
rm(df_short)
这可能是一个非常noob的问题,但我很难理解如何做到这一点,所以我很感激你的帮助!
编辑:
按照@ SimonShine的建议,我已经运行了这段代码,它确实有效!
答案 0 :(得分:3)
您没有指定是否尝试将子集收集到一个数据集中,或者您是否尝试为每个子集创建一个文件。您引用的OPP_1985
超出了您编写的代码的范围。您的意思是引用df_short
吗?
您可以首先将您想要对一个数据文件执行的操作抽象为函数,例如:
extract_and_save_from_dataset <- function(csvfile) {
df <- read.csv(csvfile, header=F, stringsAsFactors=T, sep="\t")
df_short <- df[df$V6 == "OPP",]
csvfile_short <- gsub(".csv", "_short.csv", csvfile)
write.csv(df_short, file=csvfile_short, row_names=F)
}
假设您有一组数据集文件名,您可以多次应用此功能:
# csvfiles <- c("OPP_1985.csv", "OPP_1986.csv", ...)
csvfiles <- list.files("/path/to/my/csvfiles")
for (csvfile in csvfiles) {
extract_and_save_from_dataset(csvfile)
}
答案 1 :(得分:0)
data.table
方法可能是最快的选择,特别是如果你有一个大数据集。函数fwrite{data.table}
使用许多CPUS并行工作,使其非常快。
以下是根据基于df$V6
的值定义的子组划分原始数据的方法,并将每个子集保存到单独的.csv
文件中。
library (data.table)
set(df)[, fwrite(.SD, paste0("output_", V6,".csv")), by = V6, .SDcols=names(df) ]
PS。文件名称为output_*.csv
,其中*为对应的V6
值。