10

数値のブロックと NA のブロックを含むベクトルでは、次のようになります。

score <- c(0,1,2,3,4,NA,NA,0,-1,0,1,2,NA,NA,NA)

NAのブロックの前の最新の値から1ずつ上向きにカウントすることにより、欠損値をシミュレートする方法はありますか?

したがって、最終的には次のようになります。

score.correct <- c(0,1,2,3,4,5,6,0,-1,0,1,2,3,4,5)

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

4

3 に答える 3

4

r-help の Christos Hatzisから引用:

rna <- function(z) { 
  y <- c(NA, head(z, -1))
  z <- ifelse(is.na(z), y+1, z)
  if (any(is.na(z))) Recall(z) else z }

rna(score)
#[1]  0  1  2  3  4  5  6  0 -1  0  1  2  3  4  5

りゅう:

rna(c(NA,score))
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

rna(c(1,rep(NA,1e4)))
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

基準:

score2 <- 1:1e5
set.seed(42)
score2[sample(score2,10000)] <- NA
library(microbenchmark)
microbenchmark(rna(score2),incna(score2))

Unit: milliseconds
           expr      min        lq    median        uq       max
1 incna(score2)  2.93309  2.973896  2.990988  3.134501  5.360186
2   rna(score2) 50.42240 50.848931 51.228040 52.778043 56.856773
于 2013-02-01T13:51:30.197 に答える
4

Q+D、ループがあり、不必要な追加を行いますが、仕事はします:

incna <- function(s){
  while(any(is.na(s))){
    ina = which(is.na(s))
    s[ina]=s[ina-1]+1
  }
  s
}


> score
 [1]  0  1  2  3  4 NA NA  0 -1  0  1  2 NA NA NA
> incna(score)
 [1]  0  1  2  3  4  5  6  0 -1  0  1  2  3  4  5

最初の項目が NA の場合、警告のみで失敗します。

> score
 [1] NA  1  2  3  4 NA NA  0 -1  0  1  2 NA NA NA
> incna(score)
 [1]  5  1  2  3  4  5  3  0 -1  0  1  2  3  4  5
Warning message:
In s[ina] = s[ina - 1] + 1 :
  number of items to replace is not a multiple of replacement length
于 2013-02-01T13:52:32.177 に答える
2

別のアプローチを次に示します。

library(zoo)
ifelse(is.na(score), na.locf(score) + sequence(rle(is.na(score))$l), score)
#  [1]  0  1  2  3  4  5  6  0 -1  0  1  2  3  4  5

スロットを[]示す中間結果の表示:NA

na.locf(score)
#  [1]  0  1  2  3  4  [4]  [4]  0 -1  0  1  2  [2]  [2]  [2]
sequence(rle(is.na(score))$l)
#  [1]  1  2  3  4  5  [1]  [2]  1  2  3  4  5  [1]  [2]  [3]
na.locf(score) + sequence(rle(is.na(score))$l)
#  [1]  1  3  5  7  9  [5]  [6]  1  1  3  5  7  [3]  [4]  [5]
ifelse(is.na(score), na.locf(score) + sequence(rle(is.na(score))$l), score)
#  [1]  0  1  2  3  4  [5]  [6]  0 -1  0  1  2  [3]  [4]  [5]
于 2013-02-01T18:26:57.197 に答える