【问题标题】:Replace NA conditionally in a more efficient way [duplicate]以更有效的方式有条件地替换 NA [重复]
【发布时间】:2021-02-17 18:31:38
【问题描述】:

我有一系列ID穿插NA

x <- c("A", NA, NA, "A", "B", NA, "B", "A", NA, NA, NA, "A", "B", NA, "A")

我需要用最后一个非NA 值替换任何NA 如果下一个非NA 值与最后一个非NA NA 值(例如,"B", NA, "B")。但是,两个相同的非NA 之间的NA 的数量可能会有所不同。这让我想到了这个庞大的代码:

library(dplyr) 
ifelse(is.na(x) & lag(is.na(x),1) & lag(is.na(x),2), lag(x,3),
       ifelse(is.na(x) & lag(is.na(x),1),lag(x,2),
              ifelse(is.na(x) & lead(x,1) == lag(x,1) |
                       is.na(x) & lead(is.na(x),1), lag(x,1), x)))
[1] "A" "A" "A" "A" "B" "B" "B" "A" "A" "A" "A" "A" "B" NA  "A"
  • 它可以解决问题,但我想知道是否有更有效的方法不仅可以满足预定数量的干预NA,而且允许任何数量的干预NA

【问题讨论】:

    标签: r dplyr conditional-statements


    【解决方案1】:

    使用zoo 的一个选项可能是:

    ifelse(na.locf0(x) != rev(na.locf0(rev(x))), NA_character_, na.locf0(x))
    
     [1] "A" "A" "A" "A" "B" "B" "B" "A" "A" "A" "A" "A" "B" NA  "A"
    

    【讨论】:

    • 您可以使用na.locf0(x, fromLast = TRUE),而不是双重rev,如zoo 的作者the answer 所示(包含在上面的链接中)。干杯
    • @Henrik 我完全忘记了它有那个参数。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2019-06-10
    • 2020-03-14
    • 1970-01-01
    • 2023-03-21
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多