2015-09-07 4 views
0

Я хотел бы подмножество data.frame путем сочетания двух факторов от другого data.frame. Игрушечный пример ниже:подмножество data.frame сочетанием двух переменных в R (другое df)

df <- data.frame(ind=seq(748,867), A=rep(1:12, 10), 
      val1=runif(120, 2,7), val2=runif(120, 42,70)) 
new <- data.frame(A=c(3,4,5), val1=c(1,6,6.8)) 

нужно выбрать наблюдения df на основе комбинации условных в new Я пробовал:

> t1 <- subset(df, df$A %in% new$A & df$val1 > new$val1) 

> t1 
    ind A  val1  val2 
4 751 4 5.991882 55.02130 
16 763 4 6.664002 60.70389 
28 775 4 3.952898 47.50801 
29 776 5 6.448094 55.26087 
40 787 4 3.916499 67.01201 
52 799 4 5.475465 54.12958 
64 811 4 4.641724 53.29380 
76 823 4 6.186887 48.41644 
88 835 4 2.757776 57.76709 
89 836 5 6.290239 46.08715 
100 847 4 3.160457 67.57916 
112 859 4 3.988948 64.71397 
113 860 5 6.569812 42.70852 

Я ожидал получить набор наблюдений с параметрами: A == 3 & val1> 1; A == 4 & val1> 6; A == 5 & val1> 6.8

Любые идеи?

+0

векторы получают 'переработаны', т.е. повторяется. Вы можете увидеть, что произойдет, если вы сами используете 'df $ val1> новый $ val1'. – jenesaisquoi

+2

попробуйте применить подмножество один элемент за раз 'do.call (rbind, Map (function (x, y) df [df $ A == x & df $ val1> y,], новый $ A, новый $ val1)) ' –

ответ

1

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

subset(merge(df,new,by="A",all.x=TRUE), val1.x > val1.y) 

Merge гарантирует, что два вектора по сравнению имеют одинаковую длину.

Чтобы избежать каких-либо изменений в DF (переименованием знач1, добавив еще одну переменную):

names(new)[2] <- "val1.y" 
subset(merge(df,new,by="A",all.x=TRUE), val1 > val1.y)[-5] 
Смежные вопросы