R - 在循环中创建多个数据集的子集

时间:2016-02-21 13:05:33

标签: r loops

我有相当多的非常重的数据集。我想从每个中提取一个子集并将其保存到不同的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的建议,我已经运行了这段代码,它确实有效!

2 个答案:

答案 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值。