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
中,我们可以使用lag
和lead
来获取上一个和下一个值。
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
那么我们就有了一对。结果,我有向量(新列)res
和 T/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
我有一个看起来像这样的 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
中,我们可以使用lag
和lead
来获取上一个和下一个值。
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
那么我们就有了一对。结果,我有向量(新列)res
和 T/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