【问题标题】:Apply function to files from different folders (R)将功能应用于来自不同文件夹的文件 (R)
【发布时间】:2022-06-22 07:23:02
【问题描述】:

几年前我发现了 R,它在清理数据帧、准备一些数据和处理其他基本任务方面非常方便。

现在我想尝试使用 R 来应用基本处理,但同时对存储在不同文件夹中的许多不同文件进行处理。

这是我想改进为一个函数的脚本,它可以循环遍历我的文件夹“dataset_2006”和“dataset_2007”来完成所有工作。

library(dplyr)
library(readr)
library(sf)
library(purrr)

setwd("C:/Users/Downloads/global_data/dataset_2006")

shp2006 <- list.files(pattern = 'data_2006.*\\.shp$',  full.names = TRUE) 
listOfShp <- lapply(shp2006, st_read)
combinedShp <- do.call(what = sf:::rbind.sf, args=listOfShp)

#import and merge CSV files into one data frame
folderfiles <- list.files(pattern = 'csv_2006_.*\\.csv$', full.names = TRUE) 

csv_data <- folderfiles %>% 
  set_names() %>% 
  map_dfr(.f = read_delim,
          delim = ";",
          .id = "file_name")

new_shp_2006 <- merge(combinedShp, csv_data , by = "ID") %>% filter(label %in% c("AR45T", "GK879"))
   
st_write(new_shp_2006 , "new_shp_2006.shp", overwrite = TRUE)




setwd("C:/Users/Downloads/global_data/dataset_2007")

shp2007 <- list.files(pattern = 'data_2007.*\\.shp$',  full.names = TRUE) 
listOfShp <- lapply(shp2007, st_read)
combinedShp <- do.call(what = sf:::rbind.sf, args=listOfShp)

#import and merge CSV files into one data frame
folderfiles <- list.files(pattern = 'csv_2007_.*\\.csv$', full.names = TRUE) 

csv_data <- folderfiles %>% 
  set_names() %>% 
  map_dfr(.f = read_delim,
          delim = ";",
          .id = "file_name")

new_shp_2007 <- merge(combinedShp, csv_data , by = "ID") %>% filter(label %in% c("AR45T", "GK879"))
   
st_write(new_shp_2007 , "new_shp_2007.shp", overwrite = TRUE)

【问题讨论】:

  • 那么您的问题到底是什么?也许这样的事情是一个很好的起点:stackoverflow.com/questions/14958516/…。如果您提出更具体的编程问题,这将很有帮助。展示您的尝试并描述您遇到的问题。
  • 我想自动化一种方法来运行我的子文件夹“dataset_2006”的脚本,然后是子文件夹“dataset_2007”,而不必通过手动更改我的工作目录来运行它两次,就像我的情况一样发布:/

标签: r


【解决方案1】:

这很容易通过 for 循环遍历多个项目来实现。为了让我们可以使用通配符,我们还可以添加函数Sys.glob()

myfunction <- function(directories) {
  for(dir in Sys.glob(directories)) {
    # do something with a single dir
    print(dir)
  }
}

# you can specify multiple directories manually:
myfunction(c('C:/Users/Downloads/global_data/dataset_2006',
             'C:/Users/Downloads/global_data/dataset_2007'))

# or use a wildcard to automatically get all files/directories that match the pattern:
myfunction('C:/Users/Downloads/global_data/dataset_200*')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 2022-12-18
    • 2013-02-28
    • 1970-01-01
    • 2016-02-22
    • 2012-05-25
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多