基于最小5个连续值的向量序列的子集数据框
Subset data frame based on vector sequence of minimum 5 consecutive values
我有一个看起来像这样的向量:
out1[1:200]
[1] NA NA NA NA 0 1 2 NA NA NA 1 NA 0 NA 0 1 NA NA 0 NA 0 1 2 2 2 NA 0 1 2 3 4 4 5 6 7 8 9 9 9 9
[41] 10 11 NA 0 0 NA 1 NA 0 1 NA 0 NA 0 1 2 NA 1 NA 0 0 0 1 2 NA NA NA 0 0 NA 0 0 0 1 2 NA 1 2 NA 0
[81] 1 2 3 4 5 6 7 8 NA 0 1 2 3 4 NA 0 1 2 2 3 4 5 NA 0 1 2 3 3 4 5 5 6 7 NA 1 2 NA 1 2 NA
[121] 0 1 2 NA 1 2 3 3 3 3 4 NA 0 0 0 1 2 3 4 5 NA NA 0 1 NA NA NA 1 2 2 3 NA 1 2 2 2 NA NA 0 1
[161] NA 1 NA 1 2 NA 0 0 NA NA 0 1 NA NA NA NA 1 2 3 NA NA 1 2 3 4 5 6 NA 1 2 3 4 5 6 6 7 8 NA 0 1
我现在想通过该向量对 df
(具有相同的长度)进行子集化,但仅限于范围至少超过 5 个连续数字的序列,例如0:4 或 1:5(当然还有比这更长的所有内容)。因此,NA
也应该是 FALSE
。
例如
out1: NA NA 0 1 2 2 NA 0 0 1 2 3 3 4 NA
那么结果应该是
out2: F F F F F F F T T T T T T T F
你可以试试:
x = c(NA,NA,0,1,2,2,NA,0,0,1,2,3,3,4,NA)
with(rle(!is.na(x)), rep(lengths>5, lengths)) & !is.na(x)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
其他示例和结果:
x = c(NA, NA, 0, 1, 2, 2, NA, 0, 0, 1, 2, 3, 3, 4, NA, NA, NA, NA, NA, NA, NA)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x = c(NA,NA,NA,NA,NA,2,1,NA)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
下面给出了想要的结果
library(data.table) # v >= 1.9.5 (devel version - install from GitHub)
data.table(x)[,id:=rleid(!is.na(x)),
][ , aa:=(.N>5) , by = id
][ ,aaa:=4 %in% cumsum(diff(unique(sort(x)))), by = .(id, aa)
]$aaa
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
数据
x <- c(NA, NA, NA, NA, NA, 0, 1, 2, NA, 0, 1, 2, 3, 4, 4, 5, NA, 1, 2, 3, 3, 3, 3, 4, NA)
我有一个看起来像这样的向量:
out1[1:200]
[1] NA NA NA NA 0 1 2 NA NA NA 1 NA 0 NA 0 1 NA NA 0 NA 0 1 2 2 2 NA 0 1 2 3 4 4 5 6 7 8 9 9 9 9
[41] 10 11 NA 0 0 NA 1 NA 0 1 NA 0 NA 0 1 2 NA 1 NA 0 0 0 1 2 NA NA NA 0 0 NA 0 0 0 1 2 NA 1 2 NA 0
[81] 1 2 3 4 5 6 7 8 NA 0 1 2 3 4 NA 0 1 2 2 3 4 5 NA 0 1 2 3 3 4 5 5 6 7 NA 1 2 NA 1 2 NA
[121] 0 1 2 NA 1 2 3 3 3 3 4 NA 0 0 0 1 2 3 4 5 NA NA 0 1 NA NA NA 1 2 2 3 NA 1 2 2 2 NA NA 0 1
[161] NA 1 NA 1 2 NA 0 0 NA NA 0 1 NA NA NA NA 1 2 3 NA NA 1 2 3 4 5 6 NA 1 2 3 4 5 6 6 7 8 NA 0 1
我现在想通过该向量对 df
(具有相同的长度)进行子集化,但仅限于范围至少超过 5 个连续数字的序列,例如0:4 或 1:5(当然还有比这更长的所有内容)。因此,NA
也应该是 FALSE
。
例如
out1: NA NA 0 1 2 2 NA 0 0 1 2 3 3 4 NA
那么结果应该是
out2: F F F F F F F T T T T T T T F
你可以试试:
x = c(NA,NA,0,1,2,2,NA,0,0,1,2,3,3,4,NA)
with(rle(!is.na(x)), rep(lengths>5, lengths)) & !is.na(x)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
其他示例和结果:
x = c(NA, NA, 0, 1, 2, 2, NA, 0, 0, 1, 2, 3, 3, 4, NA, NA, NA, NA, NA, NA, NA)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x = c(NA,NA,NA,NA,NA,2,1,NA)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
下面给出了想要的结果
library(data.table) # v >= 1.9.5 (devel version - install from GitHub)
data.table(x)[,id:=rleid(!is.na(x)),
][ , aa:=(.N>5) , by = id
][ ,aaa:=4 %in% cumsum(diff(unique(sort(x)))), by = .(id, aa)
]$aaa
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
数据
x <- c(NA, NA, NA, NA, NA, 0, 1, 2, NA, 0, 1, 2, 3, 4, 4, 5, NA, 1, 2, 3, 3, 3, 3, 4, NA)