在 rbindlist 期间添加年份列 [duplicate]

Add a year column during rbindlist [duplicate]

提问人:Gilrob 提问时间:11/8/2023 更新时间:11/8/2023 访问量:34

问:

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

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

评论

0赞 Jon Spring 11/8/2023
看起来这可能有效。stackoverflow.com/a/59875805/6851825
1赞 r2evans 11/8/2023
我认为这就像 一样简单,这将创建一个名为索引的整数列。但是,如果您想有点花哨,您可以使用 ,然后 do,新列将包含文件名本身(而不是整数/索引)。rbindlist(L, use.names=TRUE, fill=TRUE, idcol="newid")newidfiles.to.readL <- lapply(setNames(nm=files.to.read), fread)rbindlist(..., idcol="filename")filename

答:

1赞 Andy Baxter 11/8/2023 #1

我非常喜欢为此使用(在将名称应用于列表之后):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