提问人:Gilrob 提问时间:11/8/2023 更新时间:11/8/2023 访问量:34
在 rbindlist 期间添加年份列 [duplicate]
Add a year column during rbindlist [duplicate]
问:
我正在将大量.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 年。
从上面的代码开始,我想添加一些东西,该内容将在最终数据帧中创建一个新列,该列从文档名称的末尾标记相关编号。
目前,我最好的选择是为每个文件手动添加它,但我很想避免这样做......
谢谢!
答:
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
评论
rbindlist(L, use.names=TRUE, fill=TRUE, idcol="newid")
newid
files.to.read
L <- lapply(setNames(nm=files.to.read), fread)
rbindlist(..., idcol="filename")
filename