我可以在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
使用某些字体看起来过于相似,这可能会把你搞砸(大写(。