我有一个目录,其中包含一组.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
,用readRDS
、cbind
读取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