保留具有特定字符串的行,然后保留下一行

时间:2018-09-18 08:28:58

标签: r

这是我的数据框

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 个答案:

答案 0 :(得分:4)

另一种方法,与您所做的非常相似,只是一步而无需重新排序:

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

答案 1 :(得分:2)

使用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 :(得分:1)

使用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