通过逻辑运算符和 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
我有以下“随机”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