基于另一个数据框的内容对数据框进行子集筛选。

13

我有两个数据框。为了举例,让我们假设它们长这样:

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

我想做的是将'df1'子集化,以包含第一列值与'df2'第一列中任何值匹配的行。

现在,我尝试过:

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

但这告诉我我需要大小相等的数据框。你有什么想法吗?

1个回答

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 
> 

2
你可以省略 which,因为你可以直接使用布尔向量进行索引 -- 因此 df1[df1$x %in% df2$y, "x"] 更短。我喜欢使用 which(),因为有时我只想得到索引以确保获得正确的中间结果。 - Dirk Eddelbuettel
2
你如何对 df1 进行子集操作,使其大于 df2 而不是匹配? - chimpsarehungry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接