代码之家  ›  专栏  ›  技术社区  ›  Saurabh Chauhan

忽略第二个或更多连续0

  •  3
  • Saurabh Chauhan  · 技术社区  · 6 年前

    我正在尝试解决非常基本的示例,并尝试提取以下数据:

    count   SN  data.stamp 
    1   00601   2018-07-26 13:38:39       
    0   00601   2018-11-05 23:00:09       
    0   00601   2018-11-05 23:00:16        
    4   00601   2018-11-12 23:00:05        
    0   00601   2018-12-12 23:00:05        
    5   00601   2018-11-12 23:00:05        
    0   00601   2018-12-12 23:00:05
    0   00601   2018-11-12 23:00:05        
    0   00601   2018-12-12 23:00:05
    

    预期输出:

    count   SN  data.stamp 
    1   00601   2018-07-26 13:38:39       
    0   00601   2018-11-05 23:00:09       
    4   00601   2018-11-12 23:00:05        
    0   00601   2018-12-12 23:00:05        
    5   00601   2018-11-12 23:00:05        
    0   00601   2018-12-12 23:00:05
    

    我想只考虑一次 0 价值。如果有多个 然后它应该只考虑第一个值并忽略 计数。

    基本上,我只查找第一个零值,然后是非零值。

    我试着用 rle 但是我想从 data.frame . 准分子激光原位杂交 可以提供有关值和长度的信息。我会写 for 循环检查,但要寻找快速和短期的方法。

    2 回复  |  直到 6 年前
        1
  •  2
  •   akrun    6 年前

    我们可以使用 rleid data.table 为创建逻辑向量 filter 排成一行

    library(dplyr)
    df1 %>%
       filter(!duplicated(cbind(data.table::rleid(count), SN)))
    

    更准确地说, 莱德 可应用于逻辑向量

    df1 %>% 
      filter(!duplicated(cbind(rleid(count== 0), SN)))
    

    这个 莱德 检查相邻元素的相似性,如果不相等,则增加1创建的ID。即

    v1 <- c(1, 0, 0, 5, 4, 5, 5)
    rleid(v1)
    #[1] 1 2 2 3 4 5 5
    

    现在,所有相邻的重复元素都被赋予相同的ID。如果我们在将“0”识别为重复项时是特定的

    rleid(v1 == 0)
    #[1] 1 2 2 3 3 3 3
    

    这里,只有两个值,即 TRUE/FALSE

    v1 == 0
    #[1] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
    

    缠绕 duplicated 返回索引的逻辑索引


    如果我们想要一个 base R 解决方案,这可以用 rle . 通过复制 values lengths 并通过包装得到逻辑向量 复制的 像以前一样

    i1 <- with(rle(!df1$count), rep(seq_along(values), lengths))
    i2 <- !duplicated(cbind(i1, df1$SN))
    df1[i2, ]
    #  count  SN          data.stamp
    #1     1 601 2018-07-26 13:38:39
    #2     0 601 2018-11-05 23:00:09
    #4     4 601 2018-11-12 23:00:05
    #5     0 601 2018-12-12 23:00:05
    #6     5 601 2018-11-12 23:00:05
    #7     0 601 2018-12-12 23:00:05
    

    数据

    df1 <- structure(list(count = c(1L, 0L, 0L, 4L, 0L, 5L, 0L, 0L, 0L), 
        SN = c(601L, 601L, 601L, 601L, 601L, 601L, 601L, 601L, 601L
        ), data.stamp = c("2018-07-26 13:38:39", "2018-11-05 23:00:09", 
        "2018-11-05 23:00:16", "2018-11-12 23:00:05", "2018-12-12 23:00:05", 
        "2018-11-12 23:00:05", "2018-12-12 23:00:05", "2018-11-12 23:00:05", 
        "2018-12-12 23:00:05")), class = "data.frame", row.names = c(NA, 
    -9L))
    
        2
  •  5
  •   Cath    6 年前

    在基R中,可以对data.frame进行子集,以仅获取 count 与0不同或 计数 是0,但前一行与0不同:

    df[df$count!=0 | (df$count==0 & c(TRUE, head(df$count, -1)!=0)), ]
    # (or: subset(df, count!=0 | (count==0 & c(TRUE, head(count, -1)!=0))))
    
    #  count  SN          data.stamp
    #1     1 601 2018-07-26 13:38:39
    #2     0 601 2018-11-05 23:00:09
    #4     4 601 2018-11-12 23:00:05
    #5     0 601 2018-12-12 23:00:05
    #6     5 601 2018-11-12 23:00:05
    #7     0 601 2018-12-12 23:00:05