是否可以将文件名自动设置为列名?

问题描述 投票:1回答:1

我对R还是比较陌生。我有一个包含许多文件的文件夹(例如5m.xls,10m.xls等)。我使用map_dfc读取文件(请参见下面的代码)并将它们放在一张表中。文件包含2列(x,y)的表。运行代码后得到的表包含名为x1,y1,x2,y2,.......的列因此,我无法确定它来自哪个文件。我想将列名设置为从中读取文件的名称,所以我尝试了此操作:

file_list <- list.files("folder", full.names=TRUE,pattern = ".xls")
files<-tibble()
files<-map_dfc(file_list,.f=read_excel ,col_names=c("nm",file))

但是我得到的列具有相同的文件名。有谁知道我如何自动执行此操作?

r tidyverse readxl
1个回答
1
投票

您可以使用正则表达式从file_list的字符元素中提取文件名,并将它们作为附加列添加到每个导入的数据框中,或设置新的列名。

请注意,我使用.xlsx而不是.xls。当我使用后者时,由于某种原因(可能是写入.xls的问题),我得到了一个错误。确保更改后缀以使用文件。

首先,库和数据:

library(tidyverse)
library(readxl)
library(writexl)

dir.create("folder")
walk(1:4, ~ write_xlsx(tibble(x = sample(10, 5), y = sample(10, 5)),
                       str_glue("folder/file{.}.xlsx")
                       )
         )

要获得所需的数据帧格式,可以执行以下操作:

map_dfc(file_list, ~ {
    df <- read_excel(.)
    set_names(df, paste(str_match(., "/(.*?)\\.")[,2], names(df), sep = "_"))
})

这将返回一个看起来像这样的“宽”数据框:

# A tibble: 3 x 8                                                                                                     
  file1_x file1_y file2_x file2_y file3_x file3_y file4_x file4_y
    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1       8       9       5       3       3       6       3       9
2       3       5       8       6       7       5       2       5
3       4      10       7       2       8       2       7       1

但是如果要用dplyr进行汇总或用ggplot2可视化数据,这种类型的数据框不是很有用。我建议您改用“长”格式。将read_excel置于对mutate的调用中,该调用会添加具有提取文件名的变量:

file_list <- list.files("folder", full.names=TRUE, pattern = ".xlsx")
map_df(file_list, ~ mutate(read_excel(.), file = str_match(., "/(.*?)\\.")[,2]))

您应该得到一个看起来像这样的数据框,其中观察结果按文件名分组:

# A tibble: 12 x 3                                                                                                    
       x     y file 
   <dbl> <dbl> <chr>
 1     8     9 file1
 2     3     5 file1
 3     4    10 file1
 4     5     3 file2
 5     8     6 file2
 6     7     2 file2
 7     3     6 file3
 8     7     5 file3
 9     8     2 file3
10     3     9 file4
11     2     5 file4
12     7     1 file4
© www.soinside.com 2019 - 2024. All rights reserved.