我有大约100个文件(长文件名)和模拟数据。主题是两种物质的降解,因此我有3个相关的列:时间,物质1的相对浓度(Sub1,从1.0到零)和相对浓度。物质2(Sub2)。
我想读取文件,确定99%的每个基板降级的时间,并在数据帧中保存适当的时间。现在我将结果保存在文本文件中,但这非常不舒服,正如您所发现的那样。
names<-dir(pattern="txt")
z <- 0.99 #degradation level
a <- 1-z
for (n in names){
data <- read.table(file=n,header=T)
attach(data)
matchs1 <- Time[abs(Sub1-a)==min(abs(Sub1-a))]
matchs2 <- Time[abs(Sub2-a)==min(abs(Sub2-a))]
degrad <- cbind(matchs1,matchs2)
setwd("C:/.../subdirectory")
write.table(degrad, file=paste(n,"99",".txt"),sep=" ",row.names=FALSE)
}
我不想写文件,而是想在连续的行中的数据帧中写出结果(降级)。
由于我还是初学者,我认为还有一种更简单的方法可以做到这一切吗?
提前感谢您的帮助......
答案 0 :(得分:2)
我在这些情况下通常使用的框架是:
do.call(rbind, lapply(file_list, function(file_name) {
# open file_name, do whatever processing
# then return result as a data.frame (with data for just this one file,
# then rbind will bind everything together)
# in your example that would be the data.frame "degrad"
})) -> your_combined_dataframe
如果您改用data.table
,则可以do.call(rbind,
替换rbindlist(
答案 1 :(得分:1)
你不必在这里使用for
循环,但是使用其他任何东西都不会看到速度上的重大改进,因为for
循环的开销与读取数据相比是最小的
要获取data.frame,只需稍微更改for
循环,然后输出到可以预先分配的数据帧,其行数等于文件数
# Pre-allocate results data.frame
res <- data.frame( matchs1 = numeric(length(names)) , matchs2 = numeric(length(names)) )
# Fill it
for (i in 1:length(names)){
data <- read.table(file=names[i],header=T)
matchs1 <- with( data, Time[abs(Sub1-a)==min(abs(Sub1-a))] )
matchs2 <- with( data , Time[abs(Sub2-a)==min(abs(Sub2-a))] )
res[i,] <- cbind(matchs1,matchs2)
}
你绝对不使用attach
。请改用with
。我无法完全测试,因为我无法访问您的文件和数据,但我认为这将有效。