11

他の値に触れずに、ベクトル内の連続する NA を単一の NA に減らす必要があります。
したがって、たとえば、次のようなベクトルが与えられた場合:

NA NA  8  7 NA NA NA NA NA  3  3 NA -1  4

私が得る必要があるのは、次の結果です:

NA  8  7 NA  3  3 NA -1  4

現在、次の機能を使用しています。

reduceConsecutiveNA2One <- function(vect){
  enc <- rle(is.na(vect))

  # helper func
  tmpFun <- function(i){
    if(enc$values[i]){
      data.frame(L=c(enc$lengths[i]-1, 1), V=c(TRUE,FALSE))
    }else{
      data.frame(L=enc$lengths[i], V=enc$values[i])
    }
  }

  Df <- do.call(rbind.data.frame,lapply(1:length(enc$lengths),FUN=tmpFun))

  return(vect[rep.int(!Df$V,Df$L)])
}

正常に動作しているように見えますが、おそらくこのタスクを達成するためのより簡単で高速な方法があります。

助言がありますか ?

前もって感謝します。

4

4 に答える 4

13

ここに1つのアイデアがあります:

x <- c(NA, NA,8,7,NA, NA, NA, NA, NA, 3, 3, NA, -1,  4)

x[!(is.na(x) & diff(c(FALSE, is.na(x)))==0)]
# [1] NA  8  7 NA  3  3 NA -1  4

## It also works for length-one vectors
x <- NA
x[!(is.na(x) & diff(c(FALSE, is.na(x)))==0)]
# [1] NA
于 2012-09-28T15:41:10.403 に答える
3

多分これは役に立つかもしれません

x <- c(NA, NA,8,7,NA, NA, NA, NA, NA, 3, 3, NA, -1,  4)
c(x[rowSums(is.na(embed(x,2)))!=2], x[length(x)])
[1] NA  8  7 NA  3  3 NA -1  4

関数が必要な場合は、次を試してください。

myfun <- function(x){
  if(length(x)==1) {
    return(x)
  }
  else{
    return(c(x[rowSums(is.na(embed(x,2)))!=2], x[length(x)]))
  }
}

> myfun(x)
[1] NA  8  7 NA  3  3 NA -1  4
> y <- c(x, NA, NA, NA, 3)
> y
 [1] NA NA  8  7 NA NA NA NA NA  3  3 NA -1  4 NA NA NA  3
> myfun(y)
 [1] NA  8  7 NA  3  3 NA -1  4 NA  3
> myfun(NA)
[1] NA
> myfun(1)
[1] 1
于 2012-09-28T15:25:32.573 に答える
3

headとを使用した楽しい小さなエクササイズtail

merge.na <- function(x) c(head(x, 1), tail(x, -1)[!(is.na(tail(x, -1)) &
                                                    is.na(head(x, -1)))])
于 2012-09-28T17:59:31.583 に答える
0

他の応答ほどクールではありませんが、次を使用した別のアプローチrleです。

x <- c(NA, NA,  8,  7, NA, NA, NA, NA, NA,  3,  3, NA, -1,  4)
x[is.na(x)] <- 999
y <- rle(x)
y[[1]][y[[2]]==999] <- 1
y[[2]][y[[2]]==999] <- NA
rep(y[[2]], y[[1]])

#per Dason's Suggestion:
inverse.rle(y)

rleがNA をグループ化していないことは、私にとっては驚くべきことです。これは次のことを行います。

> rle(x)
Run Length Encoding
  lengths: int [1:13] 1 1 1 1 1 1 1 1 1 2 ...
  values : num [1:13] NA NA 8 7 NA NA NA NA NA 3 ...

したがって、999 に再コード化する必要があります。

于 2012-09-28T15:57:24.443 に答える