基于给定的索引集生成子集

时间:2014-08-12 16:19:05

标签: r

有一个数据集,A,如

id grade
1  10
2  20
3  30
4  40

此外,还有另一个索引数据集B,如

id
2
3

我想基于B提取A的子集,结果看起来像

id  grade
2   20
3   30

2 个答案:

答案 0 :(得分:1)

这是一个data.table解决方案。如果您的数据集A很大,或者您必须执行此操作很多次,这将会快得多。

set.seed(1)                                  # for reproducible example
A <- data.frame(id=1:1e6,grade=10*(1:1e6))   # 1,000,000 rows
B <- data.frame(id=sample(1:1e6,1000))       # random sample of 1000 ids

library(data.table)
setDT(A)              # convert A to a data.table
setkey(A,id)          # set the key
result <- A[J(B$id)]  # extract records based in id

在此示例中,data.table的速度比%in%merge(...)快20倍。

另请注意,虽然所有三个都检索相同的记录,但它们不一定是相同的顺序。

A$id %in% B$id

创建长度为A$id的逻辑向量,如果在T中找到该元素,则哪些元素为B$id,然后将其用于子集A。因此,结果中的记录与A的顺序相同。

merge(A,B)

按公共列(id)对结果进行排序,因此结果按id的值增加进行排序。在您的示例和此示例中,前两个是相同的。

A[J(B$id)]

返回以B$id排序的结果(在此示例中,它是随机的,但与您示例中接近的其他两个相同)。

答案 1 :(得分:0)

试试这个:

> x <- data.frame(id=1:4, grade=(1:4)*10)
> x
  id grade
1  1    10
2  2    20
3  3    30
4  4    40
> id <- 2:3
> x[ x$id %in% id, ]
  id grade
2  2    20
3  3    30

或者你也可以:

> id <- data.frame(id=2:3)
> merge(x, id)
  id grade
1  2    20
2  3    30