我有一个目录目录:
models <- dir("shopperml_pr_points")
> models
[1] "add_email_subscribers" "custom_domain" "email_campaign" "fb_connect" "gmb"
[6] "holdout" "ola" "ols" "post_to_fb" "sev"
在每个目录中都有另一个文件目录,例如
> list.files(paste0("shopperml_pr_points", "/", models[1]))
[1] "add_email_subscribers_task_completed_pr_auc_1547157396.csv" "add_email_subscribers_task_completed_pr_auc_1547157473.csv"
[3] "add_email_subscribers_task_completed_pr_auc_1547157551.csv" "add_email_subscribers_task_completed_pr_auc_1547157631.csv"
[5] "add_email_subscribers_task_completed_pr_auc_1547157712.csv"
我想创建一个数据框列表,模型中的每个目录一个。因此,第一个df将基于目录“ add_email_subscribers”,并将是上述5个csv文件的组合。
我想在每个this帖子中使用do.call(rbind,read.table),但是由于我不在与实际读取文件所在的目录中,因此我发现了这一挑战。我设法为每个单独的csv文件粘贴一个长字符串,但我想知道是否有更优雅的r解决方案可以检测文件的完整路径,例如list.files(paste0("shopperml_pr_points", "/", models[1]))
中的文件。
如何基于模型中的目录创建9个数据帧的列表,其中每个目录包含约5个csv文件,而这5个csv文件应折叠为一个数据帧?
答案 0 :(得分:1)
这应该做到。首先获取子目录subdirs
,然后为每个子目录读取文件并将它们绑定在一起。然后,您将得到一个dfs列表。
parent_dir <- "shopperml_pr_points"
subdirs <- dir(parent_dir, full.names=TRUE)
df_list <- lapply(subdirs, function(path){
files <- dir(path, full.names=TRUE, pattern="\\.csv$")
return(do.call(rbind, lapply(files, read.csv)))
})
如果要跟踪每个df中哪些行来自哪些文件,可以在每个df中添加一个from_file
列。例如这样的:
df_list2 <- lapply(subdirs, function(path){
files <- dir(path, full.names=TRUE, pattern="\\.csv$")
inner_df_list <- lapply(files, function(fname){
dat <- read.csv(fname)
dat$from_file <- fname
return(dat)
})
return(do.call(rbind, inner_df_list))
})
答案 1 :(得分:1)
list.files(path = 'C:/Users/Documents/', all.files = T, full.names = TRUE)