首页 > 解决方案 > 使用 read.csv 保存文件路径

问题描述

我正在使用以下方法加载一堆 csv:

data_path_list <- list.files(path = getwd(), recursive = T, pattern = "\\QVDR.csv", full.names = T)

data <- do.call(rbind, lapply(data_path_list, function(x) {
  read.csv(x, skip = 3)
})) %>% 
  mutate(
    Source = data_path_list
  )

我正在使用 Source 列来尝试保留加载该特定文件的路径,但它不起作用。

标签: r

解决方案


如果您使用dplyr( mutate),那么我强烈建议您使用bind_rows代替do.call(rbind, ...). 一个很好的好处是它可以分配一个id字段:

# setup
write.csv(mtcars[1:3,], file="mt.csv")
file.copy("mt.csv", "mt2.csv")

library(dplyr)
rawdat <- sapply(list.files(pattern = "mt.*\\.csv", full.names = TRUE), read.csv, simplify = FALSE)
names(rawdat)
# [1] "./mt.csv"  "./mt2.csv"
bind_rows(rawdat, .id = "id")
#          id             X  mpg cyl disp  hp drat    wt  qsec vs am gear carb
# 1  ./mt.csv     Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# 2  ./mt.csv Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# 3  ./mt.csv    Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# 4 ./mt2.csv     Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# 5 ./mt2.csv Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# 6 ./mt2.csv    Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

sapply(vec, fun, simplify=FALSE)注意:和之间的一个区别lapply(vec, fun)是,如果vec未命名,sapply将有效地将其值分配为名称names(vec) <- veclapply将不会。lapply使用with可以获得相同的效果setNames(lapply(vec, fun), vec)


推荐阅读