3

R を使用して、センサーから毎分来るデータを蓄積しています。「WIDTH」と「HEIGHT」は増加しているはずです。残念ながら、データには NA と順不同の値が含まれています (たとえば、行 8 には範囲外の値 12.0、13.0 があります)。 私が望むのは、順不同の値を NA に設定することです。

次に、データセット「ex」を自分で帰属させます。データが膨大になる可能性があるため、次のような手順を作成しました。

m<-15 
for(i in 2:m){
  ex$WIDTH[i]<- ifelse(ex$WIDTH [i]- ex$WIDTH [i-1]<0,NA, ex$WIDTH [i])
  ex$HEIGHT[i]<- ifelse(ex$HEIGHT[i]- ex$HEIGHT [i-1]<0,NA, ex$HEIGHT [i])
}

しかし、結果は間違っています。

元のデータ セット

   ID    CTIME         WIDTH HEIGHT
1  HM001 201212121301 1201.9 1115.5
2  HM001 201212121302 1202.2 1115.8
3  HM001 201212121303 1202.8 1115.8
4  HM001 201212121304     NA 1116.1
5  HM001 201212121305 1203.9 1116.7
6  HM001 201212121306     NA 1116.7
7  HM001 201212121307     NA 1116.7
8  HM001 201212121308   12.0   31.0
9  HM001 201212121309 1206.0 1118.2
10 HM001 201212121310 1206.3 1118.6
11 HM001 201212121311 1206.5 1118.8
12 HM001 201212121312     NA     NA
13 HM001 201212121313 1207.3     NA
14 HM001 201212121314 1207.9 1121.1
15 HM001 201212121315 1208.4 1121.3

for ステートメントの結果

   ID    CTIME        ACTIVE_KWH REACTIVE_KWH
1  HM001 201212121301     1201.9       1115.5
2  HM001 201212121302     1202.2       1115.8
3  HM001 201212121303     1202.8       1115.8
4  HM001 201212121304         NA       1116.1
5  HM001 201212121305         NA       1116.7
6  HM001 201212121306         NA       1116.7
7  HM001 201212121307         NA       1116.7
8  HM001 201212121308         NA           NA
9  HM001 201212121309         NA           NA
10 HM001 201212121310         NA           NA
11 HM001 201212121311         NA           NA
12 HM001 201212121312         NA           NA
13 HM001 201212121313         NA           NA
14 HM001 201212121314         NA           NA
15 HM001 201212121315         NA           NA

私が期待するもの (row8 WIDTH=NA, HEIGHT=NA)

   ID    CTIME         WIDTH HEIGHT
1  HM001 201212121301 1201.9 1115.5
2  HM001 201212121302 1202.2 1115.8
3  HM001 201212121303 1202.8 1115.8
4  HM001 201212121304     NA 1116.1
5  HM001 201212121305 1203.9 1116.7
6  HM001 201212121306     NA 1116.7
7  HM001 201212121307     NA 1116.7
8  HM001 201212121308     NA     NA
9  HM001 201212121309 1206.0 1118.2
10 HM001 201212121310 1206.3 1118.6
11 HM001 201212121311 1206.5 1118.8
12 HM001 201212121312     NA     NA
13 HM001 201212121313 1207.3     NA
14 HM001 201212121314 1207.9 1121.1
15 HM001 201212121315 1208.4 1121.3
4

1 に答える 1

4

更新します。私の元のソリューションには2つの欠陥があります。データにNAsが含まれている場合は機能せず、2つの連続する順序が正しくない値に対しては機能しません。以下の解決策は、これらの問題の両方を解決します。引数cummaxがないので、minのトリックが必要です。na.rm

SetOutOfOrderValuesToNA <- function(x) {
  min <- min(x, na.rm = TRUE)
  x[is.na(x)] <- min - 1
  x[x < cummax(x)] <- NA
  x
}

> x <- c(1.1, 2.2, 3.3, 0.1, NA, 0.1, 0.2, 0.3, 6, 0.2, 7, 8)
> SetOutOfOrderValuesToNA(x)
 [1] 1.1 2.2 3.3  NA  NA  NA  NA  NA 6.0  NA 7.0 8.0

オリジナルのソリューション。

最初にベクトルから始めましょう。もしも

x <- c(1, 2, 3, 0.1, 4, 5, 6, 0.2, 7, 8)

次に、次のコードは、奇妙な(たとえば、順序が狂っている)値を次のように設定しますNA

n <- length(x)
x[-1][x[-n] > x[-1]] <- NA
> x
[1]  1  2  3 NA  4  5  6 NA  7  8

これが機能する理由を理解するのは良い練習です。次に、関数を定義します

SetOutOfOrderValuesToNA <- function(x) {
  n <- length(x)
  x[-1][x[-n] > x[-1]] <- NA
  x
}

データフレームで呼び出します。

ex$WIDTH <- SetOutOfOrderValuesToNA(ex$WIDTH)
ex$HEIGTH <- SetOutOfOrderValuesToNA(ex$HEIGHT)
于 2013-01-30T01:08:38.137 に答える