使用文件名的子字符串在数据帧列表中创建新变量



我有一个目录,其中包含一组.rds文件:

files <- c("file_2022-11-30.rds", "file_2022-12-01.rds")

我想读取每个文件到一个列表中,然后为列表中的每个数据框分配一个新列,其中包含加载它的文件的名称片段(日期)。我知道如何用for循环做到这一点,但我正在寻找一个简洁的解决方案。我确信有一种方法可以用lapply做到这一点,但这不起作用:

library(dplyr)
df_list <- lapply(files, readRDS) %>%
lapply(FUN = function(x) mutate(date = as.Date(stringr::str_sub(files[x], start = -14, end = -5)))) %>%
bind_rows()

期望的输出看起来像这样:

var1       date
1     1 2022-11-30
2     2 2022-11-30
3     2 2022-11-30
4     1 2022-11-30
5     2 2022-11-30
6     2 2022-12-01
7     1 2022-12-01
8     2 2022-12-01
9     1 2022-12-01
10    2 2022-12-01

我们可以在files上使用as.Date,并将其转换为Date类。然后循环遍历files,用readRDScbind读取Map中的"日期",rbind读取list元素

dates <-  as.Date(files, format = "file_%Y-%m-%d.rds")
do.call(rbind, Map(cbind, lapply(files, readRDS), dates = dates))

或者如果我们想使用tidyverse

library(purrr)
library(dplyr)
map2_dfr(files, dates, ~ readRDS(.x) %>%
mutate(dates = .y))

在OP的代码中,files[x]不会工作,因为x不是索引,它是list元素,即readRDS的输出,x中没有关于files的信息。相反,我们可以在单个lapply

中执行一次。
lapply(files, function(x)      
readRDS(x) %>%
mutate(date = as.Date(stringr::str_sub(x, start = -14, end = -5)))) %>%
bind_rows

最新更新