我有一个数据框,我想从第2列中提取位置的开始和结束,其中第4列中的值等于0.我在此数据框中有数千行。
C1 C2 C3 C4
R1 1 val 182
R1 2 val 22
R1 3 val 45
R1 4 val 0
R1 5 val 0
R1 6 val 0
R1 7 val 0
R1 8 val 108
R1 9 val 99
R1 10 val 0
R1 11 val 0
我想找到第4列中的值等于0的范围,例如4-7和10-11。如何找到并打印此范围?
答案 0 :(得分:0)
我们可以使用rleid
和if
all
创建一个分组变量“' C4'为0,然后获得' C2'
range
library(data.table)
setDT(df1)[, if(all(C4==0)) range(C2), rleid(C4 == 0)]$V1
#[1] 4 7 10 11
如果我们需要它作为范围字符串
setDT(df1)[, if(all(C4==0)) paste(range(C2), collapse=":"), rleid(C4 == 0)]$V1
#[1] "4:7" "10:11"
或使用tidyverse
library(tidyverse)
df1 %>%
group_by(grp = cumsum(c(TRUE, diff(C4 != 0) < 0))) %>%
filter(C4 == 0) %>%
summarise(Range = list(range(C2))) %>%
unnest
注意:如果需要,请包含&#39; C1&#39;同样在group_by