【发布时间】:2021-09-07 02:08:22
【问题描述】:
我有一个这样的数据框:
set.seed(123)
df <- data.frame(A = sample(LETTERS[1:5], 50, replace = TRUE),
B = sample(LETTERS[1:5], 50, replace = TRUE))
我想根据两个参数过滤数据框:(i) target 符合特定条件的行和 (ii) 目标行之前的特定行数。具体来说,我想过滤 A == "A" & B == "A" 的行以及目标行之前的 五 行。我可以通过两步操作来做到这一点:首先定义一个函数,然后将函数用作slice 的输入:
Sequ <- function(col1, col2) {
# get row indices of target row with function `which`
inds <- which(col1 == "A" & col2 == "A")
# sort row indices of the rows before target row AND target row itself
sort(unique(c(inds-5, inds-4, inds-3,inds-2, inds-1, inds)))
}
library(dplyr)
df %>%
slice(Sequ(col1 = A, col2 = B))
A B
1 D C
2 D B
3 C B
4 C D
5 B B
6 A A
7 E B
8 E D
9 D C
10 D D
11 A A
12 C C
13 D E
14 B E
15 B E
16 B A
17 A A
18 C D
19 C B
20 B D
21 A B
22 A A
但肯定有一个更有效的替代这部分:sort(unique(c(inds-5, inds-4, inds-3,inds-2, inds-1, inds)))。如果我不仅要过滤前面的 5 行,而且要过滤 10 或 100 行,这种单独定义每个索引的方式很快就会变得不切实际.这部分如何编码更经济?
【问题讨论】:
-
那么,要明确的是,这两者中的哪一个适用?是不是 (1) 您想要过滤数据集以包含符合条件 (
A == "A" & B == "A") 的那些行,然后还包括紧接在每个此类行之后的 5 行。或者 (2) 您想过滤数据集以仅包含 (a) 符合条件且 (b) 前面有 5 行也符合条件的行? -
只是选项(1)...
-
明白了,谢谢!据推测,如果一个匹配的前 5 行与另一匹配的前 5 行重叠,您不希望重复。
-
给定
n <- 5,您可以使用data.table进行滚动连接,全部在一行中:setkey(df[, row := .I], row)[A == "A" & B == "B"][setkey(df[, row := .I], row), roll = -n, nomatch = 0]。结果字段需要清理,但是i.A中的数据|i.B| ...应该是你想要的。