将一个文件中的标头值匹配到 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】:我们通过mget
、split
获得'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 中的文件列表的主要内容,如果未能解决你的问题,请参考以下文章