将一个文件中的标头值匹配到 R 中的文件列表

Posted

技术标签:

【中文标题】将一个文件中的标头值匹配到 R 中的文件列表【英文标题】:Match header values from one file to list of files in R 【发布时间】:2018-03-10 19:06:15 【问题描述】:

我有一个包含数千个数据文件的文件夹(没有标签,只有列号)。我还有一个 CSV,其中包含 1) 文件夹中的文件名、2) 列标题编号和 3) 列标签的列表。 数字 3 是我需要的! 文件中的数据列的顺序相同。所以我想为每个数据文件匹配正确的列名,并通过匹配将它们绑定在一起(就像一个查找表,但是对于一个标题)。

这里是“查找标头”的虚拟数据:

filenames <- c("file1", "file1", "file1","file2","file2", "file2", "file3", "file3", "file3")
num <- c(1, 2, 3, 1, 2, 3, 1, 2, 3)
label <- c("AA", "BB", "CC", "AA", "BB", "CC", "BB", "CC", "AA")
header <- data.frame(filenames,num,label)

> header
   filenames num label
1     file1   1    AA
2     file1   2    BB
3     file1   3    CC
4     file2   1    AA
5     file2   2    BB
6     file2   3    CC
7     file3   1    BB
8     file3   2    CC
9     file3   3    AA

文件如下所示:

> file1
 1      2     3
 2.3   1.5   202.4

> file2
 1     2      3
2.1   1.0   200.8

> file3
  1      2     3
 1.0   208.1  2.1

然后我遍历目录中的这些文件,并根据列名将它们绑定在一起。

files <- dir("my dir")
z <- NULL

for (file in files) 
  x <- read.table(file.path("my dir", file), as.is=TRUE)
  names(x) <- c("AA","BB","CC") #this is where I'd like to name according to matching column
  z <- rbind(z,x) #bind current file to previous processed file

所有三个文件的期望结果!

> z

AA    BB    CC
2.3   1.5   202.4
2.1   1.0   200.8
2.1   1.0   208.1

【问题讨论】:

【参考方案1】:

我们通过mgetsplit 获得'file' 对象的值(假设它在全局环境中)'filenames' 列的'header' 和map2(来自@987654324 @) match 'y' 中的 'num' 列的列名来设置对应的 'label' 的列名

library(dplyr)
library(purrr)
mget(paste0('file', 1:3)) %>%
     map2_df(., header %>%
                 split(factor(.$filenames, levels = unique(.$filenames))),
                    ~ set_names(.x, .y$label[match(names(.x), .y$num)]))
#   AA  BB    CC
#1 2.3 1.5 202.4
#2 2.1 1.0 200.8
#3 2.1 1.0 208.1

【讨论】:

谢谢!有没有办法从“文件”中提取文件名,而不是使用paste?在此示例中,它们被标记为“file1”、“file2”,但实际上,它们的名称很长并且有数千个。希望它可以为许多文件重现。 @kslayerr 如果您只有那些对象加载到会话中,那么 ls() 并且如果它们的名称中有一些模式 mget(ls(pattern ="file\\d+")) 在遍历它们之前,我将目录中的所有文件列为“文件”。它们都以相同的字母数字开头,然后用“_”和日期分隔。

以上是关于将一个文件中的标头值匹配到 R 中的文件列表的主要内容,如果未能解决你的问题,请参考以下文章

将CSV文件中的值存储到python中的列表中

列出与R中的完整路径模式匹配的所有文件

将二进制数据移动到一个文件中的特定值到另一个文件中

有没有一种方法可以基于for循环中匹配的文件名在r中创建列表?

循环查找两个词典中的匹配值

将存储在列表中的数据帧保存到 R 中的单个文件中