Select 基于下一行 R 值的行对

Select row pair based on a value of next line R

我有一个看起来像这样的 df:

ID   value
1     A
2     C
3     A
4     B
5     C
6     B
7     A
8     B

我需要获取成对行的子集,其中第一行的值为 A,后面的行的值为 B。结果应如下所示:

ID  value
3    A
4    B
7    A
8    B

感谢您的帮助!

dplyr中,我们可以使用laglead来获取上一个和下一个值。

library(dplyr)

df %>%  
  filter(value == "A" & lead(value) == "B" | value == "B" & lag(value) == "A")

#  ID value
#1  3     A
#2  4     B
#3  7     A
#4  8     B

data.table类似,我们可以使用shift

library(data.table)

setDT(df)[value == "A" & shift(value, type = "lead") == "B" | 
          value == "B" & shift(value) == "A"]

数据

df <- structure(list(ID = 1:8, value = structure(c(1L, 3L, 1L, 2L, 
3L, 2L, 1L, 2L), .Label = c("A", "B", "C"), class = "factor")), 
class = "data.frame", row.names = c(NA, -8L))

这是我不太优雅的解决方案。我使用 sapply() 手动遍历行,然后使用 ifelse() 找到所需的对 AB。因此,如果下一个值为 B,则 A 在对中,但它只为具有 A 的行提供 TRUE,因此我进行了第二个条件检查是否 B 是一对。我正在寻找 B 的先前值,如果它是 A 那么我们就有了一对。结果,我有向量(新列)resT/F 值。现在我所要做的就是 select 只有 T 的行。最后一些化妆品。

df$res <- sapply(1:nrow(df), function(x) ifelse((df[x,2]=='A' & df[x+1,2]=='B') | (df[x,2]=='B' & df[x-1,2]=='A'),TRUE,FALSE))
    df <- df[df$res==T,]
    df$res <- NULL
    df <- df[complete.cases(df),]
    df
      ID value
    3  3     A
    4  4     B
    7  7     A
    8  8     B