【问题标题】:Find the range where values equal to zero in R [duplicate]在R中找到值等于零的范围[重复]
【发布时间】:2018-05-14 14:49:42
【问题描述】:

我有一个数据框,我想从第 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。如何找出并打印此范围?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以创建一个分组变量rleidifall'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
    

    注意:如果需要,在 group_by 中也包含“C1”

    【讨论】:

    • 非常感谢!!! setDT 解决方案完美运行!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多