基于另一数据帧的内容子集数据帧

Bra*_*sen 12 r dataframe

我有两个data.frames.例如,让我们说它们看起来像这样:

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

我想做的是子集'df1'包含第一列值与'df2'第一列中的任何值匹配的行.

现在,我试过了:

subset(df1, df1$x == df2$y)
Run Code Online (Sandbox Code Playgroud)

但这告诉我,我需要同样大小的data.frames.思考?

Dir*_*tel 15

双方%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 
> 
Run Code Online (Sandbox Code Playgroud)

  • 您可以直接使用布尔值向量删除`which`,因此`df1 [df1 $ x%in%df2 $ y,"x"]`更短.我喜欢`which()`因为我有时只想要索引来确保我得到正确的中间结果. (2认同)
  • 你如何将df1子集大于df2而不是匹配? (2认同)