2017-08-07 5 views
1

私はマルチチャネル電極システムから収集したデータを扱っていますが、これを現在より速く実行しようとしていますが、良い方法は見つけられませんループなしでそれをすること。列ごとの値を別々に比較するベクトル化

その要点は次のとおりです。私は、各列(チャネル)の平均値を変更し、ある列の各値とその列の平均値を比較する必要があります。値が調整された平均値を上回っている場合は、その値を別のデータフレームに入れて読みやすいようにする必要があります。ここで

は、問題のビットのためのいくつかのサンプルコードです:誰もが、私はそれを感謝し、正しい方向に私を指すことができので、もし

readout <- data.frame(dimnmames <- c("Values")) 
#need to clear the dataframe in order to run it multiple times without errors 
#timeFrame is just a subsection of the original data, 60 channels with upwards of a few million rows 
readout <- readout[0,] 
for (i in 1:ncol(timeFrame)){ 
    for (g in 1:nrow(timeFrame)){ 
    if (timeFrame[g,i] >= posCompValues[i,1]) 
     append(spikes, timeFrame[g,i]) 
    } 
} 

データは、上向きに1.3億測定値の50万の範囲です。このような

+2

を[小さな再現可能な例]を行ってください(https://でのstackoverflow .com/questions/5963269/how-to-make-a-great-r-reproducible-example)を参照してください。小さなサンプルデータをシミュレートするコードを共有するか、 'dput()'を使ってコピー/ペースト可能なデータのサブセットを共有してください。 – Gregor

+0

@ Gregorの助言に従うのを待っていたはずです。しかし、私はとにかくそれを撮影しました。 –

答えて

1

何かが動作する必要があり:YよりもX以上の

戻り値:

cmpfun <- function(x,y) return(x[x>y]) 

timeFrameの各要素(列)について、posCompValues

の最初の列の対応する値と比較します
vals1 <- Map(cmpfun,timeFrame,posCompValues[,1]) 

リストを1つのベクターにまとめます:

spikes <- unlist(vals1) 

あなたが値と、それは少しforループにこれを開梱する価値があるかもしれない対応する列の両方保存したい場合:

resList <- list() 
for (i in seq(ncol(timeFrame))) { 
    tt <- timeFrame[,i] 
    spikes <- tt[tt>posCompVals[i,1]] 
    if (length(spikes)>0) { 
     resList[[i]] <- data.frame(value=spikes,orig_col=i) 
    } 
} 
res <- do.call(rbind, resList) 
+0

これは機能します!データの元の列を維持する方法を理解する必要があります。再利用可能なデータセットを持たないことをお手伝いいただき、ありがとうございました。これでどうすればよいかわかりませんでした。 –

+0

Ben、これを聞いて申し訳ありませんが、私はresListとunlist関数に詳しくないので、ここで何が起こっているのか分かりません。 data.frame(value = tt [pos1]、pos1)]にエラーがあります。 引数には行数の差があります:0、1 –

+0

'resList'はありません。関数(それは私が作成した変数です)。再現可能な例を作成する良い方法は、最初のいくつかの行とデータの列を取り、必要に応じていくつかのアウトライヤ/スパイクを追加して、何かを表示するようにし、 'dput()'を使ってダンプします。結果を含めるために質問を編集してください。 –

関連する問題