R 确定测量值不适用的时间范围

R 确定测量值不适用的时间范围,r,timestamp,na,R,Timestamp,Na,我有一个数据集,其中有数十万个测量数据,这些数据是从几个受试者身上采集的。但是,测量值仅部分可用,即,NA可能存在较大的拉伸。我需要预先确定,每个受试者的时间跨度正数据可用 数据: 到目前为止,我的(拙劣的)解决方案是(i)选择不是NA的timestamp值的范围,并分别为每个受试者选择第一个和最后一个这样的timestamp。这是主题C的代码: NotNA_C <- df$timestamp[which(!is.na(df$C))] range_C <- paste(NotNA_C

我有一个数据集,其中有数十万个测量数据,这些数据是从几个受试者身上采集的。但是,测量值仅部分可用,即,
NA
可能存在较大的拉伸。我需要预先确定,每个受试者的时间跨度正数据可用

数据:

到目前为止,我的(拙劣的)解决方案是(i)选择不是
NA
timestamp
值的范围,并分别为每个受试者选择第一个和最后一个这样的
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"
但也会对其他解决方案感兴趣

可复制数据:

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您可以查看
diff
cumsum
,在没有NA的情况下,强制它们使用逻辑and子集第一个和最后一个元素

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"

您可以查看
diff
中没有NA的
cumsum
差异,强制它们使用逻辑and子集第一个和最后一个元素

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"

dplyr
解决方案

库(tidyverse)
df%
pivot_longer(-c(时间戳,开始时间))%>%
分组单位(名称)%>%
下拉菜单()%>%
总结(最小值=时间戳%>%min(),
max=时间戳%>%max()
#>`summary()`解组输出(用`.groups`参数重写)
#>#tibble:3 x 3
#>名称最小值最大值
#>                   
#>1 A 00:00:00.080 00:00:00.097
#>2b 00:00:00.066 00:00:00.147
#>3 C 00:00:00.080 00:00:00.130

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

库(tidyverse)
df%
pivot_longer(-c(时间戳,开始时间))%>%
分组单位(名称)%>%
下拉菜单()%>%
总结(最小值=时间戳%>%min(),
max=时间戳%>%max()
#>`summary()`解组输出(用`.groups`参数重写)
#>#tibble:3 x 3
#>名称最小值最大值
#>                   
#>1 A 00:00:00.080 00:00:00.097
#>2b 00:00:00.066 00:00:00.147
#>3 C 00:00:00.080 00:00:00.130
由(v0.3.0)于2021年2月15日创建

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"