如何将标识符列添加到批次的现有文件中?

How do I add identifier columns to batches of existing files?

我是 运行 一个不断生成单个 .csv 文件的计算机模型。每个文件都有一个与地理位置和实验处理相对应的唯一文件名。每个文件包含相同的数据。我想将这些文件组合成一个可以在 R 中进行统计分析的数据框。

问题是单个文件不包含标识符来说明它们代表哪个位置或处理方式。没有办法让计算机模型添加此信息(!?!)。

因此,我想获取目录中的所有 .csv 文件,向根据文件名识别它们的各个文件添加列,并将它们合并到一个数据框中。这两天我一直在摆弄 for 循环,不知道该怎么做。

我的可重现示例版本:

这里是假设的文件。

Site1.Treatment <- data.frame(Data1 = seq(1000,5000, length.out=10), Data2 = seq(10,30, length.out=10))
Site1.NoTreatment <- data.frame(Data1 = seq(2000,3000, length.out=10), Data2 = seq(10,30, length.out=10))

可以创建带有可能文件标题的数据框。

data <- data.frame(expand.grid(Site = c("Site1","Site2","Site3"), Treatment = c("Treatment","NoTreatment")))
data$extension <- "csv"
data$filename <- as.factor(interaction(data$Site, data$Treatment, data$extension)) 

然后将标识符添加到数据框中,因此它看起来像这样。

Site1.Treatment$Site <- "Site1"
Site1.Treatment$Treatment <- "Treatment"
Site1.NoTreatment$Site <- "Site1"
Site1.NoTreatment$Treatment <- "NoTreatment"

然后可以合并数据框。

All.Data <- rbind (Site1.Treatment, Site1.NoTreatment)

非常感谢您的帮助!

假设文件在工作目录中,我们用 list.files() 列出文件,通过 lapply 循环将这些文件读入 list,提取前缀('Site1', 'Site2'), 中间部分 ('Treatment', 'NoTreatment') 使用 sub, 使用 Map 创建列 'Site' 和'Treatment' 在每个 list 元素中然后 rbind 创建单个 data.frame.

files <- list.files()
lst <- lapply(files, read.csv, header=TRUE, stringsAsFactors=FALSE)
v1 <- sub('\..*', '', files)
v2 <- sub('.*\.(.*)\.csv', '\1', files)
d1 <- do.call(rbind, Map(cbind, lst, Site=v1, Treatment= v2))

按照您的示例创建一些文件,您可以执行以下操作:

# Write some files
Site1.Treatment   <- data.frame(Data1 = seq(1000,5000, length.out = 10),
                                Data2 = seq(10,30, length.out = 10))
Site1.NoTreatment <- data.frame(Data1 = seq(2000,3000, length.out = 10),
                                Data2 = seq(10,30, length.out = 10))

write.csv(Site1.Treatment, file = "Site1.Treatment.csv")
write.csv(Site1.NoTreatment, file = "Site1.NoTreatment.csv")

# Read and combine the data
files <- list.files(pattern = "*.csv")

do.call(rbind, lapply(files, function(x) data.frame(read.csv(x), filename = x)))

然后您可以解析文件名变量以提取您需要的信息。

那么,您在一个公共目录中有一组具有公共数据元素的文件吗?

如果是这样,可以使用 library(plyr):

非常优雅地完成此操作
# example data:
write.csv(data.frame(x= rnorm(100), y= rnorm(100)), "f1.csv", row.names= FALSE)
write.csv(data.frame(x= rnorm(100), y= rnorm(100)), "f2.csv", row.names= FALSE)
write.csv(data.frame(x= rnorm(100), y= rnorm(100)), "f3.csv", row.names= FALSE)

# with your working directory set as the location with all the files:

library(plyr)
# create a list with the file names and the file ids that you wish
# IE- "ids" should be character vector of your choosing.
l2 <- data.frame(fls= dir(), ids= 1:length(dir()))
l2$fls <- as.character(l2$fls)
l2 <- split(l2, l2$ids)

# read in your files and add the ID column
l_ply(.data= l2, .fun= function(l, ids) {
  x <- read.csv(l$fls, header= TRUE, stringsAsFactors = FALSE)
  x$id <- l$id
  write.csv(x, l$fls, row.names = FALSE, col.names = TRUE)
  })

# now read in, and bind your files which have the appended ID column.
x <- ldply(dir(), .fun= read.csv, header= TRUE, stringsAsFactors=FALSE)