2016-10-03 12 views
0

私はRパッケージに含まれている機能の一部に、最後にovbservationを転送してNAsを埋め込みます(locf)。 locfは、私が良い列goodcolsの下で呼び出したものを除いて、データフレーム内のすべての列に実装する必要があります(つまり、badcolsに適用する必要があります)。 badcolsの列名は何でもかまいません。私は以下のlocf関数とfor-loopを使用してこれを達成します。ただし、大きなデータセットを使用すると、forループが少し遅くなります。提示されたシナリオでは、誰かがより高速な代替案やNAsを記入する別の方法を提案できますか?ここで データフレーム内で最後の観測が繰り越されました

は、例えば、データフレームである:(足りないだけでコメントへの評判)

しかし、答えを書くための

#Test df 
TIME <- c(0,5,10,15,20,25,30,40,50) 
AMT <- c(50,0,0,0,50,0,0,0,0) 
COV1 <- c(10,9,NA,NA,5,5,NA,10,NA) 
COV2 <- c(20,15,15,NA,NA,10,NA,30,NA) 
ID <- rep(1, times=length(TIME)) 

df <- data.frame(ID,TIME,AMT,COV1,COV2) 
df <- expand.grid(df) 

goodcols <- c("ID","TIME","AMT") 
badcols <- which(names(df)%in%goodcols==F) 

#---------------------------------------------------- 
#locf function 
locf <- function (x) { 
    good <- !is.na(x) 
    positions <- seq(length(x)) 
    good.positions <- good * positions 
    last.good.position <- cummax(good.positions) 
    last.good.position[last.good.position == 0] <- NA 
    x[last.good.position] 
} 
#------------------------------------------------------ 
#Now fill in the gaps by locf function 
for (i in badcols) 
{ 
    df[,i] <- locf(df[,i]) 
} 
+0

'zoo'パッケージから' na.locf'関数を見ましたか? – Jaap

+0

[このQ&A](http://stackoverflow.com/questions/26171958/fill-in-missing-values-by-group-in-data-table)は、スピードが問題となる場合に役立ちます。 – Jaap

+0

@ProcrastinatusMaximus事は私の場合、私は 'goodcols'と呼んでいるものだけを知っています。帰属する列名は不明です。したがって、私は使用できる一般的なものが必要です。これは私が持っているfor-loopに描かれています。実際に列挙する列名がわかっていれば、na.locfを使うことができます。 – daragh

答えて

2

申し訳@ProcrastinatusMaximusが言ったようにやってからあなたを防ぐ何? (あなたは、ループ内の動物園の呼び出しを含めることができます)

は次のようになります。

for (i in badcols) 
{ 
    df[,i] <- zoo::na.locf(df[,i]) 
} 

私は動物園があなたの実装よりも高速であるかどうかわからないです。これを試してみる必要があります。また、spacetime :: na.locf、imputeTS :: na.locfをチェックして、既存のlocf実装のどれが最速かを確認することもできます。

関連する問題