如何将标识符列添加到批次的现有文件中?
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)
我是 运行 一个不断生成单个 .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)