我正在运行一个不断生成单个.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 :(得分: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)))
然后你可以解析filename变量来提取你需要的信息。
答案 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)