【问题标题】:Determine range of time where measurements are not NA确定测量值不适用的时间范围
【发布时间】:2021-05-18 05:58:32
【问题描述】:

我有一个数据集,其中包含来自多个受试者的数十万个测量值。但是,测量结果仅部分可用,即NA 可能存在较大的延伸。我需要预先确定每个受试者都可以获得哪些时间跨度的正数据。

数据:

df
      timestamp      C     B      A starttime_ms
1  00:00:00.033     NA    NA     NA           33
2  00:00:00.064     NA    NA     NA           64
3  00:00:00.066     NA 0.346     NA           66
4  00:00:00.080 47.876 0.346 22.231           80
5  00:00:00.097 47.876 0.346 22.231           97
6  00:00:00.099 47.876 0.346     NA           99
7  00:00:00.114 47.876 0.346     NA          114
8  00:00:00.130 47.876 0.346     NA          130
9  00:00:00.133     NA 0.346     NA          133
10 00:00:00.147     NA 0.346     NA          147

到目前为止,我的(谦虚的)解决方案是(i)选择不是NAtimestamp 值的范围,并分别为每个主题选择第一个和最后一个这样的timestamp。这是主题C的代码:

NotNA_C <- df$timestamp[which(!is.na(df$C))]
range_C <- paste(NotNA_C[1], NotNA_C[length(NotNA_C)], sep = " - ")

range_C
[1] "00:00:00.080" "00:00:00.130"

这看起来并不优雅,而且,需要对所有其他科目重复。有没有更有效的方法来一次性确定所有受试者都可以使用非NA 值的时间范围?

编辑

我找到了base R 解决方案:

sapply(df[,2:4], function(x) 
  paste(df$timestamp[which(!is.na(x))][1], 
        df$timestamp[which(!is.na(x))][length(df$timestamp[which(!is.na(x))])], sep = " - "))
                            C                             B                             A 
"00:00:00.080 - 00:00:00.130" "00:00:00.066 - 00:00:00.147" "00:00:00.080 - 00:00:00.097"

但也会对其他解决方案感兴趣!

可重现的数据:

df <- structure(list(timestamp = c("00:00:00.033", "00:00:00.064", 
                             "00:00:00.066", "00:00:00.080", "00:00:00.097", "00:00:00.099", 
                             "00:00:00.114", "00:00:00.130", "00:00:00.133", "00:00:00.147"
), C = c(NA, NA, NA, 47.876, 47.876, 47.876, 47.876, 47.876, 
         NA, NA), B = c(NA, NA, 0.346, 0.346, 0.346, 0.346, 
                                0.346, 0.346, 0.346, 0.346), A = c(NA, NA, NA, 22.231, 22.231, NA, NA, NA, NA, 
                                                            NA), starttime_ms = c(33, 64, 66, 80, 97, 99, 114, 130, 133, 
                                                                                  147)), row.names = c(NA, 10L), class = "data.frame")

【问题讨论】:

    标签: r timestamp na


    【解决方案1】:

    您可以查看没有 NA 的 differences 的 cumsum,将它们强制为逻辑和子集第一个和最后一个元素。

    lapply(data.frame(apply(rbind(0, diff(!sapply(df[c("C", "B", "A")], is.na))), 2, cumsum)),
           function(x) c(df$timestamp[as.logical(x)][1], rev(df$timestamp[as.logical(x)])[1]))
    # $C
    # [1] "00:00:00.080" "00:00:00.130"
    # 
    # $B
    # [1] "00:00:00.066" "00:00:00.147"
    # 
    # $A
    # [1] "00:00:00.080" "00:00:00.097"
    

    【讨论】:

      【解决方案2】:

      dplyr解决方案

      library(tidyverse)
      
      
      df <- structure(list(timestamp = c("00:00:00.033", "00:00:00.064", 
                                         "00:00:00.066", "00:00:00.080", "00:00:00.097", "00:00:00.099", 
                                         "00:00:00.114", "00:00:00.130", "00:00:00.133", "00:00:00.147"
      ), C = c(NA, NA, NA, 47.876, 47.876, 47.876, 47.876, 47.876, 
               NA, NA), B = c(NA, NA, 0.346, 0.346, 0.346, 0.346, 
                              0.346, 0.346, 0.346, 0.346), A = c(NA, NA, NA, 22.231, 22.231, NA, NA, NA, NA, 
                                                                 NA), starttime_ms = c(33, 64, 66, 80, 97, 99, 114, 130, 133, 
                                                                                       147)), row.names = c(NA, 10L), class = "data.frame")
      
      
      df %>% 
        pivot_longer(-c(timestamp, starttime_ms)) %>% 
        group_by(name) %>%  
        drop_na() %>% 
        summarise(min = timestamp %>% min(),
                  max = timestamp %>% max())
      #> `summarise()` ungrouping output (override with `.groups` argument)
      #> # A tibble: 3 x 3
      #>   name  min          max         
      #>   <chr> <chr>        <chr>       
      #> 1 A     00:00:00.080 00:00:00.097
      #> 2 B     00:00:00.066 00:00:00.147
      #> 3 C     00:00:00.080 00:00:00.130
      

      reprex package (v0.3.0) 于 2021 年 2 月 15 日创建

      【讨论】:

        猜你喜欢
        • 2012-08-25
        • 2021-07-02
        • 2017-11-09
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-07
        相关资源
        最近更新 更多