有没有办法自动将文件名设置为列名?
Is there a way to set filename as column names automatically?
我对 R 比较陌生。我有一个包含很多文件的文件夹(例如 5m.xls、10m.xls、...)。我使用 map_dfc 读取文件(参见下面的代码)并将它们放在一个 table 中。这些文件包含 2 列 (x,y) 的 table。
我在 运行 之后得到的 table 我的代码包含名为 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))
但是我得到了用相同文件名命名的列。
有谁知道我如何自动执行此操作?
您可以使用正则表达式从 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 = "_"))
})
这将 return 一个看起来像这样的 "wide" 数据框:
# 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
可视化数据,则此类数据框不是很有用。我建议您改用 "long" 格式。将 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
我对 R 比较陌生。我有一个包含很多文件的文件夹(例如 5m.xls、10m.xls、...)。我使用 map_dfc 读取文件(参见下面的代码)并将它们放在一个 table 中。这些文件包含 2 列 (x,y) 的 table。 我在 运行 之后得到的 table 我的代码包含名为 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))
但是我得到了用相同文件名命名的列。 有谁知道我如何自动执行此操作?
您可以使用正则表达式从 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 = "_"))
})
这将 return 一个看起来像这样的 "wide" 数据框:
# 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
可视化数据,则此类数据框不是很有用。我建议您改用 "long" 格式。将 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