【问题标题】:NA if the value is enclosed between NANA 如果值包含在 NA 之间
【发布时间】:2020-02-04 15:33:20
【问题描述】:

我正在尝试清理我的数据。假设我们有一个包含 20 个值的向量,其中包含多个 NAs

set.seed(1234)
x <- rnorm(20, mean = 10, sd = 5) %>% round
x[c(6, 8, 12, 16, 19)] <- NA

所以它看起来像这样: &gt; 4 11 15 -2 12 NA 7 NA 7 6 8 NA 6 10 15 NA 7 5 NA 22

我需要将NA 中的值替换为NA)。例如。我的向量中的7 应该是NA,因为上一个和下一个值是NA。我可以用ifelse 语句和一些dplyr 函数来做到这一点:

library(dplyr)

ifelse(is.na(lag(x))&is.na(lead(x)), NA, x)

> 4 11 15 -2 12 NA NA NA  7  6  8 NA  6 10 15 NA  7  5 NA NA

问题是如何替换NA 所包含的两个值。 75 例如?我试图复制条件,即制作lag(lag(x))lead(lead(x)),但我搞砸了。

ifelse(is.na(lag(x))&is.na(lead(x)) | is.na(lead(lead(x)))&is.na(lag(lag(x))), NA, x)
 >  4 11 15 -2 12 NA NA NA  7 NA  8 NA  6 NA 15 NA  7  5 NA NA

【问题讨论】:

    标签: r dplyr na


    【解决方案1】:

    我们可以按 NA 分组并计算每个组的长度。如果它的长度为 3,那么这意味着该组由 NA, value, value 组成。我们只需将这些值替换为 NA。

    i1 <- cumsum(is.na(x))
    x[ave(i1, i1, FUN = function(i)length(i)) == 3] <- NA
    #[1]  4 11 15 -2 12 NA  7 NA  7  6  8 NA  6 10 15 NA NA NA NA 22
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-20
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2014-03-31
      • 2021-04-15
      相关资源
      最近更新 更多