3

Forループなしでこれをやろうとしていますが、理解できません。

列の最初の NA をデフォルト値の 0.0000001 に置き換えたいと考えています。

Last Observation Carried Forward (LOCF) 代入を行っていますが、デフォルト値を指定したいと考えています。

次の data.frame がある場合:

> Col1        Col2        Col3        Col4
> 1           NA          10          99
> NA          NA          11          99
> 1           NA          12          99
> 1           NA          13          NA

私はそれを次のようにしたい:

> Col1        Col2        Col3        Col4
> 1           0.0000001   10          99
> 0.0000001   NA          11          99
> 1           NA          12          99
> 1           NA          13          0.0000001 

これは動作するコードですが、非常に遅いです...

#Temporary change for missing first observation
for (u in 1:ncol(data.frame))
{
  for (v in 1:nrow(data.frame)) 
  {
    #Temporary change the first observations in a row to 0.0000001 until it encounters a value that isn't NA
    if(is.na(temp_equity_df_merge2[v,u]))
    {
        temp_equity_df_merge2[v,u]=0.0000001
    }
    else break
  }

apply またはより高速なバリアントを使用したい。20 列と 100 万行をループしています。

助けてくれてありがとう。

4

3 に答える 3

4

各列に関数を適用できます。

myfun <- function(x) {
  x[which(is.na(x))[1]] <- 0.1

  return(x)
}

> data.frame(apply(dat, 2, myfun))
   v1  v2 v3   v4
1 1.0 0.1 10 99.0
2 0.1  NA 11 99.0
3 1.0  NA 12 99.0
4 1.0  NA 13  0.1
> 
于 2012-06-25T21:18:24.370 に答える
1

コメントに基づいて、apply各列に関数を適用するために使用できます。NAこの関数は最初のものを 0.0000001に置き換え、行列を返します。次に、 を使用na.locfして残りNAの s を埋めることができます。最後に、あなたが a の代わりに adata.frameを要求したので、すべてをまとめました。data.framematrix

data.frame(na.locf(apply(dat, 2, function(x) {
    firstNA <- head(which(is.na(x)), 1) #position of first NA
    x[firstNA] <- 0.0000001
    x
})))
   Col1  Col2 Col3    Col4
1 1e+00 1e-07   10 9.9e+01
2 1e-07 1e-07   11 9.9e+01
3 1e+00 1e-07   12 9.9e+01
4 1e+00 1e-07   13 1.0e-07
于 2012-06-26T13:54:49.647 に答える
1

このような大規模なデータ セットがある場合、データのコピーを避けるためにdata.tableandを使用します。setどちらのapplyソリューションも、データを少なくとも 1 回コピーします。

解決策には for ループが含まれますが、効率的なものです (それぞれが瞬時に実行される length(valid_replace) こと)

library(data.table)

DT< -as.data.table(dat)

replacing <- lapply(DT, function(x)which(is.na(x))[1])

valid_replace <- Filter(Negate(is.na), replacing)

replace_with <- 0.0001

for(i in seq_along(valid_replace)){
  set(DT, i = valid_replace[i], j = names(valid_replace)[i], value = replace_with)
}
于 2012-10-03T07:04:33.383 に答える