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"