【问题标题】:r taking last and first non NA elements from vectorr 从向量中获取最后一个和第一个非 NA 元素
【发布时间】:2019-04-12 18:31:15
【问题描述】:

我有一个数据框

a = c(NA,NA,NA,NA,NA,40,32,46,98,900,NA,NA,78,87,43,78,NA,NA,NA)
b = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)
d = cbind(a,b)

我想从第一个非 NA 元素到最后一个元素中获取部分数据。结果应该是:

40 32 46 98 900 NA Na 78 87 43 78
6   7  8  9  10 11 12 13 14 15 16 

我应该如何解决我的问题?

【问题讨论】:

标签: r matrix vector


【解决方案1】:

你可以使用zoo包中的na.trim函数

> zoo::na.trim(d)

    a  b
6   40  6
7   32  7
8   46  8
9   98  9
10 900 10
11  NA 11
12  NA 12
13  78 13
14  87 14
15  43 15
16  78 16

注意-您也可以查找na.trim函数的sides参数以进行更多更改。

【讨论】:

    【解决方案2】:

    base R 的一种可能是:

    d[rev(cumsum(rev(!is.na(a)))) != 0 & cumsum(!is.na(a)) != 0, ]
    
            a  b
     [1,]  40  6
     [2,]  32  7
     [3,]  46  8
     [4,]  98  9
     [5,] 900 10
     [6,]  NA 11
     [7,]  NA 12
     [8,]  78 13
     [9,]  87 14
    [10,]  43 15
    [11,]  78 16
    

    在各个步骤中:

    rev(cumsum(rev(!is.na(a))))
    
     [1] 9 9 9 9 9 9 8 7 6 5 4 4 4 3 2 1 0 0 0
    
    cumsum(!is.na(a))
    
     [1] 0 0 0 0 0 1 2 3 4 5 5 5 6 7 8 9 9 9 9
    
    rev(cumsum(rev(!is.na(a)))) != 0 & cumsum(!is.na(a)) != 0
    
     [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    [14]  TRUE  TRUE  TRUE FALSE FALSE FALSE
    

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 2015-01-11
      • 2021-10-23
      • 2016-06-05
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2013-12-01
      相关资源
      最近更新 更多