Подмножество фрейма данных на основе содержимого другого фрейма данных

У меня есть два data.frames. Для примера скажем, что они выглядят так:

df1 <- data.frame(x=rep(letters[1:26], 16))
df2 <- data.frame(y=letters[1:4])

Что я хотел бы сделать, так это подмножество «df1», содержащее строки, значение первого столбца которых соответствует любому значению в первом столбце «df2».

Теперь я пробовал:

subset(df1, df1$x == df2$y)

Но это говорит мне, что мне нужны data.frames одинакового размера. Мысли?


person Brandon Bertelsen    schedule 10.08.2010    source источник


Ответы (1)


Для этого можно использовать как %in%, так и match(). Вот бывший:

> which( df1$x %in% df2$y )
 [1]   1   2   3   4  27  28  29  30  53  54  55  56  79  80  81  82 105
[18] 106 107 108 131 132 133 134 157 158 159 160 183 184 185 186 209 210
[35] 211 212 235 236 237 238 261 262 263 264 287 288 289 290 313 314 315
[52] 316 339 340 341 342 365 366 367 368 391 392 393 394
> 
>
> table(df1[ which( df1$x %in% df2$y ), "x"])

 a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y 
16 16 16 16  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
 z 
 0 
> 
person Dirk Eddelbuettel    schedule 10.08.2010
comment
Вы можете отбросить which, так как вы можете индексировать напрямую с помощью вектора логических значений, поэтому df1[ df1$x %in% df2$y , "x"] короче. Мне нравится which(), так как иногда мне нужны только индексы, чтобы убедиться, что я получаю правильные промежуточные результаты. - person Dirk Eddelbuettel; 10.08.2010
comment
Как бы вы подмножили df1 больше, чем df2 вместо совпадения? - person chimpsarehungry; 26.02.2013