有一个数据集,A,如
id grade
1 10
2 20
3 30
4 40
此外,还有另一个索引数据集B,如
id
2
3
我想基于B提取A的子集,结果看起来像
id grade
2 20
3 30
答案 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