代码之家  ›  专栏  ›  技术社区  ›  Roccer

保留具有特定字符串的行和下一行

r
  •  2
  • Roccer  · 技术社区  · 7 年前

    这是我的数据框

    df <- data.frame(
      id = 1:14,
      group_id = c(rep(1:2, each = 3), rep(3:4, each = 4)),
      type = rep("A", 14), stringsAsFactors = FALSE)
    
    df[c(2,4,8,12),"type"] <- "B"
    
       id group_id type
    1   1        1    A
    2   2        1    B
    3   3        1    A
    4   4        2    B
    5   5        2    A
    6   6        2    A
    7   7        3    A
    8   8        3    B
    9   9        3    A
    10 10        3    A
    11 11        4    A
    12 12        4    B
    13 13        4    A
    14 14        4    A
    

    我想保留所有B型的行以及下一行。

    我可以…

    B <- which(df$type=="B")
    afterB <- B+1
    df_sel <- df[c(B, afterB), ]
    df_sel <- df_sel[order(df_sel$id),]
    df_sel
    

    …得到我想要的。

       id group_id type
    2   2        1    B
    3   3        1    A
    4   4        2    B
    5   5        2    A
    8   8        3    B
    9   9        3    A
    12 12        4    B
    13 13        4    A
    

    如何以更通用的方式完成这项工作?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Ronak Shah    7 年前

    使用 lag dplyr

    library(dplyr)
    df[df$type == "B" | lag(df$type == "B", default = FALSE), ]
    
    #   id group_id type
    #2   2        1    B
    #3   3        1    A
    #4   4        2    B
    #5   5        2    A
    #8   8        3    B
    #9   9        3    A
    #12 12        4    B
    #13 13        4    A
    
        2
  •  4
  •   Cath    7 年前

    另一种方法,非常类似于您所做的操作,但只需一步操作,无需重新排序:

    df_sel <- df[rep(which(df$type=="B"), e=2)+c(0, 1), ] 
    df_sel
       # id group_id type
    # 2   2        1    B
    # 3   3        1    A
    # 4   4        2    B
    # 5   5        2    A
    # 8   8        3    B
    # 9   9        3    A
    # 12 12        4    B
    # 13 13        4    A
    
        3
  •  1
  •   Paul    7 年前

    使用grep将提供b的所有实例的行索引- rows 并列的 c() 这与 rows + 1 从中选择 df 会工作。

    rows <- grep("B", df[, "type"])
    df[sort(c(rows, rows + 1)), ]
    

    给予:

       id group_id type
    2   2        1    B
    3   3        1    A
    4   4        2    B
    5   5        2    A
    8   8        3    B
    9   9        3    A
    12 12        4    B
    13 13        4    A