2016-07-19 6 views
2

私は1000列の時系列データセットを持っています。もちろん、各行は異なるレコードです。データセット全体に散在するいくつかのNA値があります。NAをNの隣の列の値に置き換える関数/ループR

各NAを隣接する左値または隣接右値のいずれかに置き換えたい場合は、どちらの値でもかまいません。

私が進めてきたのは、最後の列にない限り、各NAをその右側の値に置き換えることです。その場合は、その値を左側に置き換えます。


私はちょうどループのためにやるつもりだったが、私は関数は、より効率的であると仮定します。基本的に、私は隣接する値を参照する方法がわかりませんでした。ここで

は私がしようとしていたものです:あなたが言うことができるように

for (entry in dataset) { 
    if (any(is.na(entry)) == TRUE && entry[,1:999]) { 
    entry = entry[,1] 
    } 
    else if (any(is.na(entry)) == TRUE && entry[,1000]) { 
    entry = cell[,-1] 
    } 
} 

は、私はRと経験の浅いよ:)本当にわからないどのようにインデックスを左または右に値。

+2

小さな例は –

+1

質問が –

答えて

3

あなたのデータセットの転載にna.locfを使用することをお勧めします。

zooパッケージのna.locf関数は、NAを最も近い値(同じ行の+1または-1)で置き換えるように設計されています。あなたが列をしたいので、私たちは最初のデータセットを移調することができます

library(zoo) 
df=matrix(c(1,3,4,10,NA,52,NA, 11, 100), ncol=3) 
step1 <- t(na.locf(t(df), fromLast=T)) 
step2 <- t(na.locf(t(step1), fromLast=F)) 
print(df) 
#### [1,] 1 10 NA 
#### [2,] 3 NA 11 
#### [3,] 4 52 100 
print(step2) 
#### [1,] 1 10 10 
#### [2,] 3 11 11 
#### [3,] 4 52 100 

内側の列と最後の列に別の治療法があるので、私は2つのステップでそれを行います。あなたがdplyrパッケージを知っていれば、それは機能にそれを回すためにも、もっと簡単です:

library(dplyr) 
MyReplace = function(data) {data %>% t %>% na.locf(.,,T) %>% na.locf %>% t} 
MyReplace(df) 
+1

リニューアルオープン長い道のりが魅力を働い行こう! –

関連する問題