这可能是一个非常直截了当的问题,但我还没有找到答案/解决方案。
我有一个包含多个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循环不返回带有被调用的csv文件的所有列的前120行,而是返回NA。这是因为R将文件列表存储为字符串吗?
访问和遍历列表中每个csv文件的推荐方法是什么?
提前致谢!
答案 0 :(得分: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
)。{/ p>
apply(file_list, MARGIN = 1, parse_csv)
恢复以前的工作目录。
setwd(old_wd)