在 rbindlist 期间添加年份列[重复]

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

我正在将大量 .csv 文件读入单个数据帧。正如这个问题的答案所示,我已经在这方面得到了很大的帮助。

library(data.table)
files.to.read <- list.files(path = "./data", 
                            pattern = ".*\\.csv$", 
                            full.names = TRUE, 
                            recursive = FALSE)
L <- lapply(files.to.read, fread)
DT <- rbindlist(L, use.names = TRUE, fill = TRUE)

我的数据集没有标记观察年份的变量,而是包含在文件名中,例如asdf_19.csv 其中 19 指 2019 年。

从上面的代码开始,我想添加一些内容,以便在最终数据框中创建一个新列,该列标记来自文档名称末尾的相关数字。

目前我最好的选择是为每个文件手动添加此内容,但我很想避免这样做......

谢谢!

r data.table lapply
1个回答
0
投票

我非常喜欢使用

purrr::enframe
(将名称应用到列表后):

library(tidyverse)
library(data.table)

dir.create("fake_data")

2014:2018 |> 
  walk(\(year) write_csv(tibble(a = 1:100), file.path("fake_data", paste0("yr_", year, ".csv"))))


files.to.read <- list.files(path = "fake_data", 
                            pattern = ".*\\.csv$", 
                            full.names = TRUE, 
                            recursive = FALSE)

L <- lapply(files.to.read, fread)

names(L) <- str_extract(files.to.read, "\\d*(?=\\.csv)")

L |> 
  enframe("year", "data") |> 
  unnest(data)
#> # A tibble: 500 × 2
#>    year      a
#>    <chr> <int>
#>  1 2014      1
#>  2 2014      2
#>  3 2014      3
#>  4 2014      4
#>  5 2014      5
#>  6 2014      6
#>  7 2014      7
#>  8 2014      8
#>  9 2014      9
#> 10 2014     10
#> # ℹ 490 more rows
© www.soinside.com 2019 - 2024. All rights reserved.