在R中阅读多个csv文件时,添加与源文件对应的列

uqcuzwp8  于 2023-01-10  发布在  其他
关注(0)|答案(3)|浏览(127)

我正在将csv文件从列表读入一个数据集,使用

x <- do.call(rbind, lapply(list, fread))

我想在x中添加一列,指示与每行对应的文件名。
list看起来像这样:

[[1]] '~/amsterdam.csv'
[[2]] '~/atlanta.csv'
[[3]] '~/bangalore.csv'

我希望x如下所示

V1   V2           city
2.5   3.4   '~/amsterdam.csv'
5.4   1.1   '~/bangalore.csv'
3.4   2.9   '~/atlanta.csv'
0.5   9.8   '~/bangalore.csv'

有没有一种方法,使用我使用的命令,将x的每一行链接到它所来自的文件?
我目前使用一个循环来完成这一任务(读入文件,然后添加与文件名对应的列,然后将所有文件绑定在一起),但我想知道是否有更快更干净的方法来完成这一任务。

p5fdfcr1

p5fdfcr11#

我觉得这样应该行得通:

myFread <- function(fileName){
    data.frame(
        fread(fileName)
        , "city" = fileName
    )
}

当然还有这个

x <- do.call(rbind, lapply(list, fread))
ttcibm8c

ttcibm8c2#

如果你使用的是data.table,尝试rbindlist而不是do.call(rbind...。你可以使用idcol参数添加一个新的列City,该列将为每个 Dataframe 提供一个索引,以后可以从list中为这些 Dataframe 赋值。还要注意的是,list是R中的一个内部函数,最好避免将其用作变量名。

library(data.table)

x <- rbindlist(lapply(list, fread), idcol = "City")
x[, City := basename(list)[City]]
0ejtzxu1

0ejtzxu13#

带有data.table

all <- list.files(wd, full = T, pattern = "csv")
l <- lapply(all, function(x) {data.table(fread(x), "filename" = x)})
# Eventually do something on all columns
lapply(l, function (x) { x[, filename := basename(filename)] })
dt <- rbindlist( l )

相关问题