使用 lapply 从文件名的一部分将新列名添加到数据框列表

Add new column name to a list of data frames from a part of the file name using lapply

我在一个文件夹中有 10 个 excel 个文件,它们都具有相同的列。最终结果是 bind_rows 并将它们全部组合起来。每个文件代表一周(在本例中为第 1-10 周)。我正在寻找如何在最终产品中添加一个名为“Week”的新列。每个文件名看起来像“...wk1.xlsx”、“...wk2.xlsx”等。我想弄清楚如何检测“wk1”等并将其格式化为新的数据框列表中的列。

这是我的...

files <- list.files(path ="Users/Desktop/week", pattern = "*.xlsx", full.names= T) %>%
         lapply(read_excel, sheet =4, skip =39) %>%
         bind_rows()

使用 setNames() 命名文件名列表,然后在 bind_rows() 中使用 .id 参数,这会添加一个包含列表名称的列。

library(tidyverse)
library(readxl)

files <- list.files(path ="Users/Desktop/week", pattern = "*.xlsx", full.names= T) %>%
  setNames(nm = .) %>% 
  lapply(read_excel, sheet =4, skip =39) %>%
  bind_rows(.id = "Week") %>%
  mutate(Week = str_extract(Week, "wk\d+"))

您还可以使用 purrr::map_dfr():

组合迭代和 row-binding 步骤
files <- list.files(path ="Users/Desktop/week", pattern = "*.xlsx", full.names= T) %>%
  setNames(nm = .) %>% 
  map_dfr(read_excel, sheet = 4, skip = 39, .id = "Week") %>%
  mutate(Week = str_extract(Week, "wk\d+"))