通过逻辑运算符和 select 上述行对数据帧进行子集和过滤

Subset and filter a dataframe by logical operators and select the foregoing rows

我有以下“随机”Dataframe,想应用基于逻辑运算符的子集,然后提取上述行:

set.seed(3)
Sample_Data <- data.frame(A = c(1:100, 1:100, 1:100), B = c(100:1, 100:1, 100:1))
print(Sample_Data)
Test_subset <- subset(Sample_Data, subset = A == 1 & B == 100)
Test_subset
    A   B
1   1 100
101 1 100
201 1 100

用逻辑运算符做子集是没有问题的。 但现在我想知道是否可以在 R 中创建以下过滤器:“使用以下条件过滤所有行(见上文),并输出相应过滤行前面的 10 行。” 有人知道这个的解决方案吗?

您可以添加一个带有行号的列来简化此过程。

Sample_Data$row <- seq(nrow(Sample_Data))
Test_subset <- subset(Sample_Data, subset = A == 1 & B == 100)
Test_subset

#    A   B row
#1   1 100   1
#101 1 100 101
#201 1 100 201

对于上述子集中的每一行 select 接下来的 10 行。

result <- Sample_Data[unique(c(t(outer(Test_subset$row, 0:10, `+`)))), ]
result

#     A   B row
#1    1 100   1
#2    2  99   2
#3    3  98   3
#4    4  97   4
#5    5  96   5
#6    6  95   6
#7    7  94   7
#8    8  93   8
#9    9  92   9
#10  10  91  10
#11  11  90  11
#101  1 100 101
#102  2  99 102
#...
#...

如评论中所述,过滤不存在​​的行没有意义(第 1 行之前有 none)。因此,这里有一个过滤参数略有不同的解决方案。比如说,您想要过滤 A == 11 & B == 90 的目标行(此值组合在您的数据中也出现 3 次)并且您想要获取目标行之前的五行。您可以先定义一个函数来获取相关行的索引:

Sequ <- function(col1, col2) {
  # get row indices of target row with function `which`
  inds <- which(col1 == 11 & col2 == 90) 
  # 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)))
}

接下来您可以使用此函数作为 slice 的输入:

library(dplyr)
Sample_Data %>%
  slice(Sequ(col1 = A, col2 = B))
    A  B
1   6 95
2   7 94
3   8 93
4   9 92
5  10 91
6  11 90
7   6 95
8   7 94
9   8 93
10  9 92
11 10 91
12 11 90
13  6 95
14  7 94
15  8 93
16  9 92
17 10 91
18 11 90