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

时间:2015-10-26 19:40:05

标签: r csv batch-processing

我正在运行一个不断生成单个.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)

我真诚地感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

假设文件位于工作目录中,我们列出list.files()的文件,通过循环list将其读入lapply,提取前缀('Site1', 'Site2'),使用sub的中间部分('待处理','禁止处理'),使用Map在每个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))

答案 1 :(得分:0)

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

# 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)))

然后你可以解析f​​ilename变量来提取你需要的信息。

答案 2 :(得分:0)

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

如果是这样,可以使用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)