【问题标题】:Selecting n rows from several csv files and writing to new files in same directory using R从多个 csv 文件中选择 n 行并使用 R 写入同一目录中的新文件
【发布时间】:2017-07-20 18:30:54
【问题描述】:

这可能是一个非常简单的问题,但我还没有找到答案/解决方案。

我有一个包含多个 csv 文件的文件夹。我的目标是遍历所有文件,从每个文件中选择 n 行,然后将选定的行写入单独的文件。我的搜索只返回了如何对单个文件执行此操作。

temp = list.files(pattern = '*.csv')

for (i in 1:length(temp)) {
   i = as.data.frame(i) 
   n120 = i[120, ]
   outFile = paste(file_path_sans_ext(i), "_120.csv", sep="")
   write.csv(n120, file = outFile)
}

Temp 返回所有感兴趣的文件。但是,for 循环不会返回前 120 行以及调用的 csv 文件的所有列,而是返回 NA。这是因为 R 将文件列表存储为字符串吗?

访问和遍历列表中每个 csv 文件的推荐方法是什么?

提前致谢!

【问题讨论】:

    标签: r loops csv subset


    【解决方案1】:

    这是一个使用apply 的示例,但其他几个迭代器可以使用不同的方法,包括for 循环或lapply。此代码示例使用临时目录来防止运行此代码的任何人弄乱他们的工作目录。在本地运行时删除setwd() 命令。

    library(tidyverse) # dplyr and friends
    library(stringr)   # For parsing file names
    
    old_wd <- getwd()
    setwd(tempdir())   # Use a temporary directory
    

    在临时目录中创建一些虚拟 .csv 文件。同样,当您在本地计算机上使用此代码时,您可能希望删除它。

    demo <- tibble(a = rnorm(327), b = rnorm(327))
    write_csv(demo, "demo1.csv")
    write_csv(demo, "demo2.csv")
    write_csv(demo, "demo3.csv")
    

    创建工作目录中所有 .csv 文件的列表。

    file_list <- list.files() %>%
      tbl_df() %>%
      filter(str_detect(value, ".csv"))
    

    函数parse_csv 提取文件的前 120 行,然后将该数据保存为新的 .csv 文件。正确运行时返回 TRUE。随意使文件名更漂亮。

    parse_csv <- function(file) {
      print(file)
      read_csv(file) %>%
        head(120) %>%
        write_csv(paste0(file, "-head.csv"))
    
      return(TRUE)
    }
    

    现在apply 函数跨越数据的每一行 (MARGIN = 1)。

    apply(file_list, MARGIN = 1, parse_csv)
    

    恢复之前的工作目录。

    setwd(old_wd)
    

    【讨论】:

    • 谢谢!我使用虚拟变量进行了测试,但收到了 tibble 的错误:“tibble 中的错误(a = rnorm(327),b = rnorm(327)):在 'frame_data()' 调用中未检测到列名”。添加了列名,但它返回列的长度不同。创建了一个随机 df,并得到“错误:在 temp 目录中列出 csv 文件时数据不是数据框。使用我的实际数据,我在 'files = list.files(path=old_wd, pattern="* .csv")' 然后使用 MARGIN = 1 'apply'。仍然收到错误(dim(x) 必须具有正长度)。请问我应该更改什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2023-01-10
    • 2018-05-25
    相关资源
    最近更新 更多