这是一个基于我之前提出的问题的问题:Read many files, compute something, save results in dataframe (R)。
我仍然有大约 100 个包含模拟数据的文件。主题是两种物质的降解,所以我有 3 个相关列:时间(以分钟为单位)、物质 1 的相对浓度(Sub1,从 1.0 到零)和相对浓度。物质 2 (Sub2)。
这可以很好地确定某些退化级别,我必须手动输入:
z <- 0.25 #Abbaugrad
a <- 1-z
setwd("H:/...")
names<-dir(pattern="Data.txt")
result <- data.frame( matchs1 = numeric(length(names)) , matchs2 = numeric(length(names)) )
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))] )
result[i,] <- cbind(matchs1,matchs2)
}
现在我想自动化这个过程,所以我不必输入降级级别,但结果是在嵌套的 for 循环中计算的。
首先,我认为未来的想法可能会更好地使用数据列表,例如从这些文件中绘制一些数据,所以我做了:
filelist <- list.files(pattern = "Data.txt")
datalist <- lapply(filelist, function(xx)read.table(xx,header=T))
这可以很好地从模拟中绘制一些运行。
plot(datalist[[1]][,3], type="l",col="red")
for (i in 1:10){
lines(datalist[[i]][,3],col="red")
}
尝试构建以下循环的原因是我想找出 100 的平均值。我想我必须找出每次运行 1 % 到 100 % 退化的时间,然后计算平均值每个级别。
现在我只尝试一种物质:
test <- data.frame(matrix(ncol=99, nrow = 100) ) #100 runs, 99 levels
for (i in 1:length(datalist)){
for (j in seq(0.01,0.99,by=0.01)){
matchs1 <- with( datalist[[i]], Time[abs(Sub1-j)==min(abs(Sub1-j))] )
level <- paste('l',j,sep="")
test[j,] <- cbind(matchs1,level)
}}
我想构建一个新的数据框,其中每个级别(从 0.01 到 1)的结果保存在单个列中。然后我可以计算每个列的平均值并绑定它。但是我已经无法计算数据框了。
也许还有一种更简单的方法来获得不同时间序列的平均值。
我真的很感激任何帮助。
编辑:我很难提供样本数据,因为我有 100 个文件。在它们中的每一个中都有三个相关的列:Time、Sub1、Sub2。你可以这样想象:
Time Sub1 Sub2
0 1.0000 1.0000
60 0.9511 0.9888
120 0.9022 0.9555
...
24000 0.0101 0.0891
我想计算平均运行,因此对于一百个文件中的每一个,我都必须计算 0.01、0.02、0.03 ... 0.97、0.98、0.99 降级的时间。然后我想计算 ie 所有时间的平均值,其中 0.01 被降级。0.02、0.03 等也是如此。最后,我应该按升序排列 99 次。
可以附加文件吗?我没有找到这样做的选择。
编辑2:
得到的 datalist 的 dput 输出
names <- dir(pattern="Data.txt")
datalist <- lapply(names, read.table, header=TRUE)
是:
> dput(head(datalist[[1]]))
structure(list(Time = c(0L, 60L, 120L, 180L, 240L, 300L), Sub0_Abs = c(1.49899,
1.49568, 1.49544, 1.49533, 1.49521, 1.49507), Sub0_Rel = c(1,
0.9978, 0.9976, 0.9976, 0.9975, 0.9974), Sub1_Abs = c(1.49899,
1.49899, 1.49899, 1.49899, 1.49899, 1.49899), Sub1_Rel = c(1,
1, 1, 1, 1, 1), TP = c(0.15, 0.1579, 0.1584, 0.1586, 0.1589,
0.1592), TA = c(0.13, 0.16, 0.18, 0.18, 0.18, 0.22), Sub_Inflow = c(0,
0, 0, 0, 0, 0)), .Names = c("Time", "Sub0_Abs", "Sub0_Rel", "Sub1_Abs",
"Sub1_Rel", "TP", "TA", "Sub_Inflow"), row.names = c(NA, 6L), class = "data.frame")
> dput(head(datalist[[2]]))
structure(list(Time = c(0L, 60L, 120L, 180L, 240L, 300L), Sub0_Abs = c(1.49899,
1.49284, 1.49234, 1.49207, 1.49176, 1.49141), Sub0_Rel = c(1,
0.9959, 0.9956, 0.9954, 0.9952, 0.9949), Sub1_Abs = c(1.49899,
1.49899, 1.49899, 1.49899, 1.49899, 1.49899), Sub1_Rel = c(1,
1, 1, 1, 1, 1), TP = c(0.15, 0.1647, 0.1658, 0.1664, 0.1671,
0.1679), TA = c(0.13, 0.21, 0.25, 0.25, 0.25, 0.37), Sub_Inflow = c(0,
0, 0, 0, 0, 0)), .Names = c("Time", "Sub0_Abs", "Sub0_Rel", "Sub1_Abs",
"Sub1_Rel", "TP", "TA", "Sub_Inflow"), row.names = c(NA, 6L), class = "data.frame")
相关列是 Time、Sub0_Rel 和 Sub1_Rel。在我之前的问题中,我尝试稍微缩短名称。