我有一个dataframe,我想从第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。我该怎么找出这个范围并打印出来?
发布于 2018-05-14 14:51:51
我们可以用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注意:如果需要,也在C1中包括“group_by”
https://stackoverflow.com/questions/50333235
复制相似问题