【问题标题】:Remove leading and trailing NA删除前导和尾随 NA
【发布时间】:2017-08-03 04:44:06
【问题描述】:

我需要从向量中删除 leadingtrailing 缺失值 (NA)。应保留数字之间的NAs。请注意,我的下一步是索引另一个没有NA 的向量,并且只保留与第一个向量中位置相同的值。示例如下:

a <- c(NA, NA, NA, NA, NA, 5,2,3,1,2,1,5,2, NA, NA, 2,3,2,NA,NA,NA)
b <- sample(1:21)

我想要的输出是:

a1 <- c(5,2,3,1,2,1,5,2,NA,NA,2,3,2)
# leading and trailing NAs removed

b1 <- b[6:18]
# subset with the indices kept in "a" above.

我可以用条件循环来做到这一点,但我想对其进行矢量化。谢谢帮忙!

【问题讨论】:

标签: r subset na missing-data


【解决方案1】:
keep <- !cumprod(is.na(a)) & rev(!cumprod(is.na(rev(a))))
a[keep]
#[1]  5  2  3  1  2  1  5  2 NA NA  2  3  2
b[Keep]

is.naNA 值返回 TRUEcumprod 函数将逻辑值强制转换为整数,并为前导 NAs 返回 1,为所有其他值返回 0!(否定)再次将整数值强制为逻辑值。然后,我们使用rev 作为结尾的NAs。

【讨论】:

    【解决方案2】:

    查找第一个和最后一个非 NA 值并保留向量的那部分:

    a1 <- a[min(which(!is.na(a))):max(which(!is.na(a)))]
    
    > a1
    [1]  5  2  3  1  2  1  5  2 NA NA  2  3  2
    

    【讨论】:

    • 这个解决方案很清楚,但是 OP 将如何做他的下一步呢?也许您应该编辑为:p &lt;- which(!is.na(a)) ; a1 &lt;- a[p[1]:p[length(p)]] ; b1 &lt;- b[p[1]:p[length(p)]]?
    【解决方案3】:

    使用动物园包:

    library(zoo)
    
    na.trim(a)
    

    说明

    用于删除前导和尾随 NA 的通用函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2021-12-29
      • 2012-02-28
      • 1970-01-01
      • 2020-08-20
      相关资源
      最近更新 更多