0

私がRパッケージに含めている機能の一部には、NAs最後の観察が繰り越された状態での充填が含まれます(locf)。locf は、データ フレーム内のすべての列に実装する必要があります。ただし、適切な列の下で呼び出したものgoodcols(つまり、に適用する必要がありますbadcols) を除きます。の列名はbadcols何でもかまいません。locf以下の関数と for ループを使用してこれを達成します。ただし、大規模なデータ セットを使用する場合、for ループは少し遅くなります。提示されたシナリオで NA を埋めるためのより高速な代替手段または別の方法を提案できる人はいますか?

データ フレームの例を次に示します。

#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])
}
4

1 に答える 1

2

回答を書いて申し訳ありません(コメントするだけの評判ではありません)

しかし、@ProcrastinatusMaximusが言ったように、あなたがすることを妨げているのは何ですか? zoo(ループに呼び出しを含めることができます)

次のようになります。

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

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

于 2016-11-10T18:12:24.270 に答える