2017-11-17 4 views
8

は、私はそれは次のようになりますので、私は今、前の列の値とのNAを埋めるためにしたい、このフィル列NA

df <- data.frame(v1 = 10:14, v2 = c(NA, 1, NA, 3, 6), v3 = c(1, NA, NA, 9, 4)) 

    v1 v2 v3 
1 10 NA 1 
2 11 1 NA 
3 12 NA NA 
4 13 3 9 
5 14 6 4 

のようなデータフレームがある場合:

v1 v2 v3 
1 10 10 1 
2 11 1 1 
3 12 12 12 
4 13 3 9 
5 14 6 4 

私はこのように、手動でこれを行う方法を知っている:

df$v2 <- ifelse(is.na(df$v2), df$v1, df$v2) 

どのように私は多くの列との完全なデータフレームのためにこれを自動化することができますか?

答えて

8

されることに注意してください可能性:

library(dplyr) 
library(tidyr) 

data.frame(t(df)) %>% 
    fill(., names(.)) %>% 
    t() 

結果:

v1 v2 v3 
X1 10 10 1 
X2 11 1 1 
X3 12 12 12 
X4 13 3 9 
X5 14 6 4 

注:基本的に

は、私は元の向き

6
for (i in 2:ncol(df)) 
    df[,i] = ifelse(is.na(df[,i]), df[,i-1],df[,i]) 

これは、NA列のスジを越えて値を伝播します。これを必要としない場合は、forループ宣言でインデックスの順序を逆順にするだけです。

4

あなたはapplyを使用しますが、出力はあなたがtidyrからfillでこれを行うことができ、マトリックス

t(apply(df, 1, function(x){ 
    replace(x, is.na(x), x[cumsum(!is.na(x))][is.na(x)]) 
})) 
#  v1 v2 v3 
#[1,] 10 10 1 
#[2,] 11 1 1 
#[3,] 12 12 12 
#[4,] 13 3 9 
#[5,] 14 6 4 
6

使用して別のオプションに戻すことを転置、その後、下向きのすべての列を埋め、dfを転置Reduceifelseと:

df[] <- Reduce(function(x, y) ifelse(is.na(y), x, y), df, accumulate = TRUE) 

df 
# v1 v2 v3 
#1 10 10 1 
#2 11 1 1 
#3 12 12 12 
#4 13 3 9 
#5 14 6 4 
4

zoona.locf

を使用することにより
data.frame(t(apply(df,1,function(x) na.locf(x)))) 
    v1 v2 v3 
1 10 10 1 
2 11 1 1 
3 12 12 12 
4 13 3 9 
5 14 6 4 
+1

「na.locf」は、一度に 'na.locf(df、na.rm = FALSE)'のデータフレームが動作するでしょう。 (この特定のケースでは、 'na.rm = FALSE'は何もしませんが、行頭がすべてNAsであれば、それらは保存されます) –

+0

@ G.Grothendieck、それを学んでください:ありがとう – Wen