![](/img/trans.png)
[英]Subsetting a data frame based on another data frame with multiple conditions
[英]Filter data frame based on multiple conditions in another data frame
我有兩個數據框:
df
其中對於單個x
,有多個值y
matchDf
定義了我想用來過濾df
約束 我想只過濾y
max_y
或等於max_y
行,假設x
落在區間<x_from, x_to)
有沒有辦法在R中執行此操作(沒有我在下面使用的SQL)?
df <- read.table(header = TRUE, text = '
x y
100 0.1
100 0.2
100 0.3
250 0.2
250 0.3
250 0.4
375 0.2
375 0.25
375 0.35
420 0.15
420 0.16
420 0.17
500 0.23
500 0.55')
matchDf <- read.table(header = TRUE, text = '
x_from x_to max_y
0 300 .2
300 500 .3
500 99999 .5
')
library(sqldf)
sqldf('select a.*
from
df a
join matchDf b on (a.x >= b.x_from
and a.x < b.x_to
and a.y <= b.max_y)'
)
試試這個:
df[df$y <= matchDf$max_y[cut(df$x, c(0,matchDf$x_to))],]
x y
1 100 0.10
2 100 0.20
4 250 0.20
7 375 0.20
8 375 0.25
10 420 0.15
11 420 0.16
12 420 0.17
13 500 0.23
這里發生的事情是cut
給出了matchDf
哪一行df
每個觀察值應該在。然后,你只需將它用作位置行提取向量,並使用<=
來表示y
的條件關系。
要了解cut
是如何工作的,只需將其從表達式中拉出來:
> cut(df$x, c(0,matchDf$x_to))
[1] (0,300] (0,300] (0,300] (0,300] (0,300] (0,300] (300,500] (300,500] (300,500] (300,500] (300,500] (300,500] (300,500] (300,500]
Levels: (0,300] (300,500] (500,1e+05]
級別標簽是無關緊要的,因為[
使用基礎整數值來提取。
你可以做:
df[mapply(function(x, y) {
y <= matchDf$max_y[x >=matchDf$x_from & x < matchDf$x_to]
}, x=df$x, y=df$y), ]
# x y
# 1 100 0.10
# 2 100 0.20
# 4 250 0.20
# 7 375 0.20
# 8 375 0.25
# 10 420 0.15
# 11 420 0.16
# 12 420 0.17
# 13 500 0.23
對於每對(x,y)
,函數mapply
允許知道y
是否低於或等於適當的max_y
值並且應用於df
每個“couple”並返回TRUE
或FALSE
,然后根據df
進行子集化。 mapply
結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.