簡體   English   中英

根據另一個數據幀中的多個條件過濾數據幀

[英]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”並返回TRUEFALSE ,然后根據df進行子集化。 mapply結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM