沿着列表排序,从文件夹中读取文件并应用给定的功能
Sequencing along a list, reading files from folder and applying a given function
我需要帮助来修改我的代码以执行以下任务...到目前为止,我已经使用了以下问题和答案的帮助
Opening all files in a folder, and applying a function
How to assign a unique ID number to each group of identical values in a column
以下是我希望能够使用我的代码执行的操作...
- 我需要从一个文件夹中读取多个文件
- 我想用文件夹中的每个文件的名称来添加一列。我可以用 'mutate' 简单地做到这一点,但对于单个文件
- 我想单独保存每个文件的结果,也想合并到一个文件中
- 我也想将读取文件的代码与函数分开,这样我就可以应用于其他项目。
- 我试图避免使用 '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()
我需要帮助来修改我的代码以执行以下任务...到目前为止,我已经使用了以下问题和答案的帮助
Opening all files in a folder, and applying a function
How to assign a unique ID number to each group of identical values in a column
以下是我希望能够使用我的代码执行的操作...
- 我需要从一个文件夹中读取多个文件
- 我想用文件夹中的每个文件的名称来添加一列。我可以用 'mutate' 简单地做到这一点,但对于单个文件
- 我想单独保存每个文件的结果,也想合并到一个文件中
- 我也想将读取文件的代码与函数分开,这样我就可以应用于其他项目。
- 我试图避免使用 '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()