2015-03-16 2 views
4

у меня есть кадры два данных:фильтра на основе нескольких условий в другом кадре данных

  • df где в течение одного x Есть несколько значений y
  • matchDf, который определяет ограничения Я хотел бы использовать для фильтрации df

Я хотел бы, чтобы фильтровать только те строки, где 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)' 
    ) 

ответ

4

Попробуйте это:.

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] 

Этикетки на уровне не имеют значения, потому что [ использует базовые целочисленные значения для извлечения.

3

Вы можете сделать:

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 

функция mapply разрешения, для каждой пары (x,y), чтобы знать, если y меньше или равен соответствующему max_y значение и применяется к каждому «пары» из df и возвращает TRUE или FALSE, то df подмножество в соответствии с результатом mapply.

Смежные вопросы