0

これは、以前に尋ねた質問に基づいた質問です。多くのファイルを読み取り、何かを計算し、結果をデータフレーム (R) に保存します

それでも、シミュレーションからのデータを含む約 100 個のファイルがあります。トピックは 2 つの物質の分解であるため、関連する 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 まで) の結果が 1 つの列に保存される新しいデータフレームを作成したかったのです。次に、各列の平均を計算して、それをバインドできます。しかし、私はすでにデータフレームの計算に失敗しています。

異なる時系列の平均を取得する簡単な方法もあるかもしれません。

助けていただければ幸いです。

編集: 100 個のファイルがあるため、サンプル データを提供するのは難しいです。それらのそれぞれに、3 つの関連する列があります: 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

平均実行を計算したいので、100 個のファイルのそれぞれについて、0.01、0.02、0.03 ... 0.97、0.98、0.99 が劣化する時間を計算する必要があります。次に、0.01が劣化しているすべての時間の平均を計算したいと思います。0.02、0.03 なども同様です。結局、昇順で99回あるはずです。

ファイルの添付は可能ですか?それを行うオプションが見つかりませんでした。

編集2:

によって取得されたデータリストの 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 です。以前の質問では、名前を少し短くしようとしました。

4

2 に答える 2

0

@Roland が言ったように、サンプル データがないと役に立ちません。一連の z 値のコードを書いてみましたが、もちろん (データなしで) コードはテストされていません。おそらく、それはあなたが始めるのに役立つでしょう。

# try with a bunch of z values
z <- c(0.25, 0.45, 0.72, 0.83)
a <- 1-z

setwd("H:/...")
# read in all of the data and save to a list
names <- dir(pattern="Data.txt")
datalist <- lapply(names, read.table, header=TRUE)
matchs <- lapply(datalist, function(dat) 
    cbind(dat[which.min(abs(dat$Sub1-a)), ]), dat[which.min(abs(dat$Sub2-a)), ])

このあたりで迷ってしまいます。あなたが何を企んでいるのかわからないからです...

于 2013-06-20T17:14:12.977 に答える