3

我想NA用零替换每行的所有连续值,但前提是连续NAs 的数量小于 parmeter maxgap

这与函数非常相似zoo::na.locf

x = c(NA,1,2,3,NA,NA,5,6,7,NA,NA,NA)
zoo::na.locf(x,  maxgap = 2, na.rm = FALSE)

[1] 不适用 1 2 3 3 3 5 6 7 不适用 不适用 不适用

有两件事与我的目标不同:我也想替换领先的 NA,并且我想用 0 而不是最后一个非 NA 值替换 2 个连续的 NA。

我想得到

0 1 2 3 0 0 5 6 7 不适用 不适用 不适用

我如何在 R 中做到这一点。我可以使用 tidyverse 中的函数吗?

4

3 回答 3

2

If yis the result of the na.locfline then if y[i]is not NA but x[i]is NA 然后它被替换了,所以分配 0 给它。此外,如果它是在以下cumsum(...)术语为 0 时出现的前导 NA,则也将其替换。

replace(y, (!is.na(y) & is.na(x)) | cumsum(!is.na(y)) == 0, 0)
## [1]  0  1  2  3  0  0  5  6  7 NA NA NA
于 2017-02-17T14:14:48.863 回答
1

我们可以使用rle来做到这一点

f1 <- function(vec){
  rl <- rle(is.na(vec))
  lst <- within.list(rl, {
               i1 <- seq_along(values)==1
               i2 <- seq_along(values) != length(values)
               values[!((lengths==2 & values & i2)|
                      (values & i1))] <- FALSE

             })
   vec[inverse.rle(lst)] <- 0
   vec
 }
f1(x)
#[1]  0  1  2  3  0  0  5  6  7 NA NA NA
于 2017-02-17T14:06:46.520 回答
1

你可以这样做:

require(data.table)
require(dplyr)

x = c(NA,1,2,3,NA,NA,5,6,7,NA,NA,NA)

my_replace <- function(x, n, maxgap){
  if(is.na(x[1]) && n <= maxgap){
    x <- 0
  }
  x
}

data.frame(x, y=x) %>% 
  group_by(data.table::rleid(x)) %>% 
  mutate(x = my_replace(x, n(), 2), y = my_replace(y, n(), 1)) %>% 
  ungroup() %>% 
  select(x,y)

这允许您按列设置maxgap: for x 2for y 1

这导致:

# A tibble: 12 × 2
       x     y
   <dbl> <dbl>
1      0     0
2      1     1
3      2     2
4      3     3
5      0    NA
6      0    NA
7      5     5
8      6     6
9      7     7
10    NA    NA
11    NA    NA
12    NA    NA
于 2017-02-17T14:33:18.337 回答