2016-04-20 10 views
0

スライディングウィンドウの最大値または最小値に関連付けられた行番号を取得しようとしています。次に、その行番号をサブセット化して別の列から値を取得します。あなたの要求ごとにR - スライディングウィンドウの最大値または最小値のデータテーブル行番号を返します。

が、ここではdput(ヘッド(DATAFRAME3))である:ここでは

structure(list(Time = c("00:00:01|", "00:00:03|", "00:00:04|", 
"00:00:05|", "00:00:06|", "00:00:07|"), Average = c(8, 5.75, 
5.33333333333333, 5.23076923076923, 5.15, 5.15), NegativeChange = c(-3, 
-0.75, -0.333333333333333, -0.230769230769231, -0.15, -0.15), 
    PositiveChange = c(0, 0, 0.107843137254902, 0.210407239819005, 
    0.291176470588235, 0.291176470588235)), .Names = c("Time", 
"Average", "NegativeChange", "PositiveChange"), class = c("data.table", 
"data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x0000000001300788>) 

が切り捨てられたテキストデータファイルのアップロードで、その後、私はRにインポートするために使用されるコードと

http://textuploader.com/5ymml

コード:

#prepare workspace...delete prior data and values 
rm(list=ls()) 

#Load packages 
library(data.table) 
library(dplyr) 

#set working directory, setwd(filepath) 
setwd() 

#load fixed width data, n = 39 
DATAFRAME <- read.fwf("Dataframe3_Truncated.txt", widths = c(9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), header = FALSE, sep = "\t", skip = 4, na.strings = c("-")) 

#transform to data.table 
DATAFRAME <- data.table(DATAFRAME) 

#Calculate row averages, adding an "Average" column to the data set 
DATAFRAME2 <- DATAFRAME[, .(Average = rowMeans(.SD, na.rm = TRUE)), "V1"] 

#Calculate NegativeChange and PositiveChange using subscript method 
NegativeChange <- numeric(nrow(DATAFRAME2)) 
PositiveChange <- numeric(nrow(DATAFRAME2)) 
for (i in 1:(nrow(DATAFRAME2)-90)) { 
    y <- i 
    x <- i+90 
    NegativeChange[i] <- min(DATAFRAME2$Average[y:x]) - DATAFRAME2$Average[i] 
    PositiveChange[i] <- max(DATAFRAME2$Average[y:x]) - DATAFRAME2$Average[i] 
} 

#add NegativeChange and PositiveChange columns to datatable 
DATAFRAME3 <- DATAFRAME2[, .(Time = as.character(V1), Average, NegativeChange, PositiveChange)] 
DATAFRAME3 
私は終了タイムスタンプ部分をコーディングしようとしていたポイントにそれを得ます

PositiveChangeは[i:i + 90]のAverage [i]との正の最大偏差です。 NegativeChangeは、[i:i + 90]のAverage [i]からの最大負の偏差です。 EndTimestamp、と私は最大/最小値の行番号を見つけようとしている理由は、最大の平均が最も高くなるのタイムスタンプのためにする必要がありますが: [私は90 +]と分間Averageが最低のタイムスタンプ[i:i + 90]。 PositiveChange> = 1、またはNegativeChangeのときにのみEndTimestamp機能を起動しようとしました< = -1。私は最大値の行番号を見つけることを試みてきたコードの

例以下の通りです:どちらのソリューションは、PositiveChange> = 1の最大の発見のために働く、とに変換するときに悪化行うように見える

#which.max 
EndTimestamp <- numeric(nrow(DATAFRAME3)) 
for (i in seq(nrow(DATAFRAME3))) { 
    X <- (i + 1) 
    y <- (i + 91) 
    z <- (i) 
    if (DATAFRAME3$PositiveChange[i] >= 1) { 
    EndTimestamp[i] <- DATAFRAME3[(which.max(DATAFRAME3$Average[x:y]) + z), Time] 
    } else { 
    EndTimestamp[i] <- NA 
    } 
} 



#which 
TimestampRowIndex <- c() 
TimestampRowActual <- c() 
EndTimestamp3 <- numeric(nrow(DATAFRAME3)) 
for (i in seq(nrow(DATAFRAME3))) { 
    X <- (i + 1) 
    y <- (i + 91) 
    z <- (i) 
    if (DATAFRAME3$PositiveChange[i] >= 1) { 
    TimestampRowIndex <- append(TimestampRowIndex, which(DATAFRAME3$Average[x:y] == max(DATAFRAME3$Average[x:y]))) 
    TimestampRowActual <- TimestampRowIndex[length(TimestampRowIndex)] + z 
    EndTimestamp3[i] <- DATAFRAME3[as.integer(TimestampRowActual), Time] 
    } else { 
    EndTimestamp3[i] <- NA 
    } 
} 

NegativeChangeの最小値は< = -1です。データの性質上、Average> = 1の連続する行は、ほとんどの場合、同じEnd Timestampを持つ必要があります。しかし、上のコードは、タイムスタンプの昇順を生成します。そしてある時点(行928から973まで)は降順のタイムスタンプを生成しますが、これは意味をなさないものです。

私は確かに簡単な答えがありますが、Rには新しく、一般的にコーディングしていますが、時間をかけて無駄にしています。

また、z変数はwhichとwhich.max関数が検査対象の範囲に基づいてインデックス値を返すという事実を修正するものです(私は思う)。したがって、500:600の最大値がデータテーブルの504行にある場合、どの関数が4の値を返しますか?504を返すような方法がありますか?

提案?必要に応じてより多くの情報を提供してください。

+0

「cummax」と「cummin」をご覧ください。 – Gopala

+0

また、希望の出力を持つ入力データのサンプルを投稿するとよいでしょう。それに対応して作業コードを提供することができます。 – Gopala

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]。 –

答えて

0

私はあなたのコードの目的を理解していませんが、どうしてあなたはウィンドウ集約を動かす必要がありますか?たぶんあなたの問題に適したデータ構造があります。しかし、与えられたデータを使用して、私は次のように提案します:

"NegativeChange"は、所定の間隔での平均からの最小偏差です。これは定義ごとに1区間あたりの最小値です。 移動中のウィンドウ内の最小値(最大値)を探しています。あなたは行番号(または間隔で位置を取得しようとしているあなたの次のステップで

library(RcppRoll) 
DATAFRAME2$min_Average = roll_minl(Average, 90) 
DATAFRAME2$max_Average = roll_maxl(Average, 90) 

:このタスクのパッケージRcppRoll provieds便利な機能?)of interval/min この情報が必要な場合は、おそらくループを使用する必要があります。

#Calculate row averages, adding an "Average" column to the data set 
DATAFRAME2 <- DATAFRAME[, .(Average = rowMeans(.SD, na.rm = TRUE)), "V1"] 

# calculate min/max of rolling Window 
for (i in 1:nrow(DATAFRAME2)) { 
    j = min(i+90, nrow(DATAFRAME2)) # upper bound of window 
    DATAFRAME2$min_Average[i] = min(DATAFRAME2$Average[i:j]) 
    DATAFRAME2$pos_min_Average[i] = (i-1) + which.min(DATAFRAME2$Average[i:j]) 
    DATAFRAME2$max_Average[i] = max(DATAFRAME2$Average[i:j]) 
    DATAFRAME2$pos_max_Average[i] = (i-1) + which.max(DATAFRAME2$Average[i:j]) 
} 
+0

これは働いた!本当にありがとう。ソリューションのレビューでいくつかのことを学びました。とても有難い。 – biebz

関連する問題