r语言 - 如何合并(内部连接)数据帧在不同的目录共享相同的文件名



我有多个目录,其中包含多个csv文件。

dir1/file1.csv 
dir1/file2.csv

dir2/file1.csv 
dir2/file2.csv

dir2包含dir1的所有文件,甚至更多。每个文件夹里有成千上万个文件。

dir1中的所有文件与dir2中的所有文件具有相同的结构。在两个目录之间,文件共享1列,标题为'frame'。

因此,我的目标是对dir1中所有在dir2中共享相同文件名的文件(基于共享的'frame'列)执行inner_join,并将其输出到一个新目录。

对于每个文件,这将像这样:

示例数据在dir1:

individual <- c("1","1","2","2","3","4","5","5")
x <- c(665,NA,NA,NA,NA,NA,663,665)
y <- c(-474.5,NA,NA,NA,NA,NA,-474.5,-472.5)
frame <- rep(1:8)
file1 <- data.frame(individual,x,y,frame)

示例数据在dir2:

datetime <- c("2016-01-01", "2016-01-02","2016-01-03","2016-01-04","2016-01-05","2016-01-06", "2016-01-07","2016-01-08","2016-01-09","2016-01-10")
frame <- rep(1:10)
file1 <- data.frame(datetime,frame)

数据连接示例,

file1 <- inner_join(file1,file1,by = "frame").

重要的是,我想保持原始csv文件的相同名称。我有点卡在如何让这个工作在一个大规模(即执行所有文件,但只有当他们的名字匹配)

我试着用@rentrop写的这个链接修改的答案

从R

的子目录中读取同名的csv文件。
directories <- c("path1/to/file1.csv", "path2/to/file1.csv")
files <- lapply(directories, list.files, pattern="*.csv", full.names = TRUE)
files <- lapply(files, sort)
dat <- Map(function(x,y) { inner_join(read.csv(x), read.csv(y), by = "frame") },
files[[1]], files[[2]])

这不起作用,得到

zero-length inputs cannot be mixed with those of non-zero length
关于如何完成这项任务的任何建议都是非常感谢的。谢谢!

我知道怎么做了。我当然怀疑这是优雅的,所以我仍然想知道是否有人有更好的方法,但它完成了工作:

步骤1:列出每个目录下的文件:

list1 <- list.files(here::here("path","to","data1"), pattern=".csv",recursive = T, full.names = T)
list2 <- list.files(here::here("path","to","data2"), pattern=".csv",recursive = T, full.names = T)

步骤2:读取文件,同时创建一个列,文件名:

list1_files <- map2(map(list1, data.table::fread, sep=","), basename(list1), cbind)
list2_files <- map2(map(list2, data.table::fread, sep=","), basename(list2), cbind)

步骤3:将所有数据绑定在一起,并通过filename和所需列进行inner_join。请注意,我没有从步骤2代码中更改文件名列名,实际上它被自动称为V2(截至本文撰写时)。我的例子是by = c("V2","frame")

final_merge <- list(bind_rows(list1_files), bind_rows(list2_files)) %>%
reduce(function(x, y) inner_join(x, y, by = c("filename","frame")))

我不知道是否有一种方法可以在列表本身中做到这一点(每次1 df,在新列表中输出),但这对我的目的有效。

最新更新