沿着列表排序,从文件夹中读取文件并应用给定的功能

Sequencing along a list, reading files from folder and applying a given function

我需要帮助来修改我的代码以执行以下任务...到目前为止,我已经使用了以下问题和答案的帮助

以下是我希望能够使用我的代码执行的操作...

  1. 我需要从一个文件夹中读取多个文件
  2. 我想用文件夹中的每个文件的名称来添加一列。我可以用 'mutate' 简单地做到这一点,但对于单个文件
  3. 我想单独保存每个文件的结果,也想合并到一个文件中
  4. 我也想将读取文件的代码与函数分开,这样我就可以应用于其他项目。
  5. 我试图避免使用 'loop' 语句

这是我给出错误的不完整代码示例

library(tidyverse)
library(readr)
cleaningdata<- function(data){
  data$Label<-gsub(".tif", "", data$Label)
  data %>% select(Label:Solidity) %>%group_by(Label)%>%
    mutate(view = seq_along(Label), Station="T1-1")%>%
    rename(Species = Label)%>%
    mutate(view = recode(view, "1" = "a","2" = "b","3" = "c"))
}

filenames <- list.files("Data", pattern="*.txt", full.names=TRUE)
ldf <- lapply(filenames, read.txt)
res <- lapply(ldf, cleaningdata)

这是我的数据集示例 Data Folder,下面是我迄今为止的工作

fs 程序包包含有用的 dir_map 函数,它对路径中的每个文件应用一个函数。如果您需要对要使用的文件进行更多控制,您也可以将文件名向量通过管道传输到 purrr::map()

您的错误 Warning message: Unreplaced values treated as NA as .x is not compatible. Please specify replacements exhaustively or supply .default 是因为您将 1, 2, 3 重新编码为 a, b, c,但 Species 之一有 6 行,因此 4, 5, 6 被重新编码为 NA。我已经使用 letters[n] 来避免这个问题。

library(tidyverse)
library(fs)

result <- dir_map(path = 'Data', fun = function(filepath) {
  read_tsv(filepath) %>%
    select(-1) %>%
    rename(Species = Label) %>%
    mutate(Species = sub('.tif$', '', Species)) %>%
    group_by(Species) %>%
    mutate(
      View = seq_along(Species),
      View = letters[View], # a, b, c, etc. instead of 1, 2, 3, etc.
      Station = sub('.txt$', '', basename(filepath))
    )
})

# get rows from second file
result[[2]]

# bind rows from all files
result %>% bind_rows()