R函数以字符形式获取文件的目录名



我可以在folder_a:中创建csv文件列表

list1 <- dir_ls("path to folder_A")

我可以定义一个函数来添加带有文件名的列,并将这些文件组合成一个数据帧:

read_and_save_combo <- function(fileX){
read_csv(fileX) %>% 
mutate(fileX = path_file(fileX)}
combo_df <- map_df(list1, read_and_save_combo)

我想添加另一个具有封闭文件夹名称的列(对于所有文件都是一样的,folder_A(。如果我在单个文件上使用dirname((,我会得到folder_A的完整父目录路径。我只想要";folder_A";。如果我使用dirname((作为函数的一部分,我会得到另一列,但它填充了"quot;不那么重要的是,我不知道为什么我会得到"quot;不是完整路径,但更重要的是,有没有像path_parentfoldername这样的函数,可以让我在组合数据帧的每一行中添加一个新列,其中只包含包含每个文件的文件夹的名称?

谢谢!

编辑:回答后清晰的新功能:

read_and_save_combo <- function(fileX){
read_csv(fileX) %>% 
mutate(filename = path_file(fileX), foldername = dirname(fileX) %>%
str_replace(pattern = ".*/", replacement = ""))}

这是因为。是通配符,但*将含义修改为0个无穷大字符,因此"是/前面的任意字符和任意数量的字符。Gregor说过,但现在我明白了。

此外,我在专栏里写满了"&";,因为在函数中,我读取了一个文件,但随后试图用列表上的dirname操作进行变异,该列表是一个包含多个元素(多个文件(的向量。

您可以使用dirname+basename:

list1 <- list.files('folder_A_path', full.names = TRUE)
read_and_save_combo <- function(fileX) {
readr::read_csv(fileX) %>% 
dplyr::mutate(fileX = basename(dirname(fileX)))
}
combo_df <- purrr::map_df(list1, read_and_save_combo)

如果您的文件位于路径'Users/Downloads/FolderA/Filename.csv':

dirname('Users/Downloads/FolderA/Filename.csv')
#[1] "Users/Downloads/FolderA"
basename(dirname('Users/Downloads/FolderA/Filename.csv'))
#[1] "FolderA"

"path to folder_A"是一个糟糕的例子,请使用"path/to/folder_A"。您需要删除从开始到最后一个/:的所有内容

library(stringr)
str_replace("path/to/folder_A", pattern = ".*/", replacement = "")
# [1] "folder_A"

如果您担心\或其他非标准的东西,请使用dirname()作为输入。

这里有两种方法可以做我想做的事情,使用上面有用的答案:

read_and_save_combo <- function(file){
read_csv(file) %>% 
mutate(filename = path_file(file), foldername = basename(dirname(file)))}
read_and_save_combo <- function(file){
read_csv(file) %>% 
mutate(filename = path_file(file), foldername = dirname(file) %>%
str_replace(pattern = ".*/", replacement = ""))}

我学到的其他对其他初学者有帮助的基本知识:(1( 在编写函数时,将所有函数(read_csv((、dirname((等(指向一个统一变量(这里写为"文件",但它可以只是一个字母"g"或您选择的任何内容(。然后,您将避免我遇到的问题,即函数的一部分作用于一个文件,而另一部分则作用于列表。(2(

filex and fileX 

使用某些字体看起来过于相似,这可能会把你搞砸(大写(。

最新更新