【问题标题】:Building a loop in R to scan all files in a directory在 R 中构建循环以扫描目录中的所有文件
【发布时间】:2015-12-25 18:44:22
【问题描述】:

我想在这里创建一个更好的例子,假设我有文件 mtcars,我对它所做的就是将它的每一行导出到独立的文件中,并将它们放入空目录中,如下所示:

for(i in 1:nrow(mtcars))
write.table(mtcars[i,], file=paste(“mtcars”, as.character(i), ".txt",
sep=""), row.names=FALSE, sep="\t")

我想要做的是构建一个循环,以便我可以扫描一个文件夹,其中包括所有行和列名并创建一个新的数据框。

这是我到目前为止所拥有的,我认为它只做列而不是行。

myfiles<-list.files()
for(file in mayflies){
if (file=="myrows.txt"){
myrows<-read.table(file, header=TRUE, sep="\t")
}
else{
tdataset<-read.table(file, header=TRUE, sep="\t")
mydataset<-cbind(mydataset, tdataset)
rm(tdataset)
}
}
}
row.names(meditates)<-myrows

如何在上面的代码中生成我的结果,从中创建一个文件夹,扫描所有行和列,并最终使用上面列出的第一组代码创建一个新的数据框?如果你能向我解释一些逻辑,那将非常有帮助。

【问题讨论】:

    标签: r for-loop statistics


    【解决方案1】:

    我不完全确定你在问什么---你想重新创建你原来的data.frame吗?

    使用您的最小示例:

    for (i in 1:nrow(mtcars))
        write.table(mtcars[i,], file=paste("mtcars", as.character(i), ".txt", sep=""), row.names=FALSE, sep="\t")
    

    以下代码将重构mtcars

    files <- list.files(pattern = ".txt$")           # List all .txt files
    rows <- lapply(files, read.table, header = TRUE) # Read the files into list
    res <- do.call(rbind, rows)                      # combine the data.frame
    head(res)
    #   mpg cyl  disp  hp drat   wt  qsec vs am gear carb
    #1 21.0   6 160.0 110 3.90 2.62 16.46  0  1    4    4
    #2 19.2   6 167.6 123 3.92 3.44 18.30  1  0    4    4
    #3 17.8   6 167.6 123 3.92 3.44 18.90  1  0    4    4
    #4 16.4   8 275.8 180 3.07 4.07 17.40  0  0    3    3
    #5 17.3   8 275.8 180 3.07 3.73 17.60  0  0    3    3
    #6 15.2   8 275.8 180 3.07 3.78 18.00  0  0    3    3
    

    这就是你想要的吗?如果不是,请解释你想要什么作为输出。

    编辑:作为循环:

    files <- list.files(pattern = ".txt$")           # List all .txt files
    res <- NULL
    for (file in files) {
      row <- read.table(file, header = TRUE)
      res <- rbind(res, row)
    }
    head(res)
    #    mpg cyl  disp  hp drat   wt  qsec vs am gear carb
    # 1 21.0   6 160.0 110 3.90 2.62 16.46  0  1    4    4
    # 2 19.2   6 167.6 123 3.92 3.44 18.30  1  0    4    4
    # 3 17.8   6 167.6 123 3.92 3.44 18.90  1  0    4    4
    # 4 16.4   8 275.8 180 3.07 4.07 17.40  0  0    3    3
    # 5 17.3   8 275.8 180 3.07 3.73 17.60  0  0    3    3
    # 6 15.2   8 275.8 180 3.07 3.78 18.00  0  0    3    3
    

    【讨论】:

    • 很抱歉给您带来了困惑。在我原始帖子的底部代码中,我相信我所做的是将所有行导出到一个空目录中。从那里我想要做的是构建一个循环,以便我可以扫描一个文件夹,其中包括所有行和列名并创建一个新的数据框(这是我对上面代码的尝试)。我认为我当前代码的问题在于它仅适用于列,但我想获取列和行。
    • 我重新排列了段落。希望这会有所帮助。
    • 我不明白如何同时处理行和列。然后,每个文件中是否有一个数据(即单个条目或 1 x 1 data.frame)?请尝试更正或修改您的最小示例以准确反映您的问题。
    • 在每个文件中我有一行。这是由第一个代码或您作为“最小示例”编写的代码产生的。文件数对应行数。
    • 对,我明白了——我写的代码会在工作目录(文件夹)中找到所有.txt 文件,读取行,然后将这些行组合成一个@987654327 @。因此,据我所知,这似乎是您说 “我想要做的是构建一个循环,以便我可以扫描一个文件夹,其中包括所有行和列名并创建一个新的数据框。” 但是,它是在不使用 for-loop 的情况下完成的。如果这不是您所期望的,请准确地解释您想要输出什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2015-10-07
    相关资源
    最近更新 更多