Сохранить строки с определенной строкой и следующей строкой - PullRequest
0 голосов
/ 18 сентября 2018

Это мой фрейм данных

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 голосов
/ 18 сентября 2018

с использованием 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
0 голосов
/ 18 сентября 2018

Использование 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
0 голосов
/ 18 сентября 2018

Другой способ, очень похожий на то, что вы делаете, но за один шаг и без необходимости переупорядочения:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...