2015-10-26 54 views
1

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

我真诚感谢您的帮助!

+0

什么是文件名的模式? – nicola

+0

它不清楚你在哪里找到问题:机械或设计方面。您可以识别一个分隔csv数据集的列,比如说“Site”,并将它添加到每个数据集中,然后从csv中读取它们。您可以轻松地在读取csv时创建数据框,然后将所有dfs标准的列与每个df的特定值相加。这些是矢量操作,所以不需要任何for循环。这是你想要做的吗? –

回答

0

假设文件在工作目录中,我们列出文件与list.files(),用lapply循环读那些为list,提取前缀(“站点1”,“站点2”),中间部分('待遇','NoTreatment'),使用sub,使用Map在每个list元素中创建列'Site'和'Treatment',然后使用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))) 

然后你就可以解析的文件名变量来提取所需要的信息。

+0

我不认为这是预期的产出。 – akrun

+0

这实际上可以做我所需要的,谢谢。虽然有两个单独的专栏 - 网站和治疗 - 会更加整洁。 –

+0

@NicGeorge我的解决方案创建了你想要的列。 – akrun

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) 
+0

其实,是的。 –

相关问题