2013-02-15 9 views
5

特定の列の値にNA値が含まれているかどうかをテストしたい場合は、そのNAスペースに前の行の値を入力します。私はまだapplyファミリのハングを取得しようとしています。R - 各行をループし、前の行の値で塗りつぶす

など。私はこれをオンにする:

 Date Balance 
2012-01-01  1000 
2012-01-02  NA 
2012-01-03  NA 
2012-01-04  1200 
2012-01-05  1215 
2012-01-06  NA 

へ:

 Date Balance 
2012-01-01  1000 
2012-01-02  1000 
2012-01-03  1000 
2012-01-04  1200 
2012-01-05  1215 
2012-01-06  1215 
+2

動物園のパッケージから 'na.locf'を見てください。 –

+0

良いfind @Jilber。与えられた値にしたいのは近くの値に依存します(つまり、 'apply'関数でインデックスを使うことはできません)ので、' apply'ファミリはうまく動作しません。 –

+0

最も簡単な 'base'メソッドはおそらく' for'ループになります(私が間違っていれば私を修正してください):for(i in 1:length(DF $ Balance))if(DF $ Balance [i ]))DF $残高[i] = DF $残高[i-1] ' –

答えて

7

これは、動物園のパッケージからna.locf機能のための作業です。そして、あなたのdata.frameがある?na.locf

DFを考えてみましょう参照してください。また、うまくこれを行うroll = TRUEdata.tableを使用して

DF <- read.table(text="  Date Balance 
2012-01-01  1000 
2012-01-02  NA 
2012-01-03  NA 
2012-01-04  1200 
2012-01-05  1215 
2012-01-06  NA", header=TRUE) 

library(zoo) 
na.locf(DF) 
     Date Balance 
1 2012-01-01 1000 
2 2012-01-02 1000 
3 2012-01-03 1000 
4 2012-01-04 1200 
5 2012-01-05 1215 
6 2012-01-06 1215 
5

require(data.table) 
# convert Date column to date format 
df$Date <- as.Date(df$Date) 
# keep this, as we'll remove rows with NA to use `roll` 
dates <- df$Date 
# remove rows with NA 
dt2  <- na.omit(data.table(df)) 
# set key to Date 
setkey(dt2, "Date") 
# use dates which has the NA rows that will be filled 
# with value from previous column with roll=T 
dt2[J(dates), roll=T] 

#   Date Balance 
# 1: 2012-01-01 1000 
# 2: 2012-01-02 1000 
# 3: 2012-01-03 1000 
# 4: 2012-01-04 1200 
# 5: 2012-01-05 1215 
# 6: 2012-01-06 1215 
関連する問題