如何从数据框中提取与向量的任何元素相等的所有元素?

时间:2014-10-21 17:14:22

标签: r vector dataframe extract

例如,我有一个包含2个变量ID和X的数据框,X中的值可以重复,我需要从X中的值为3或4的所有元素中提取ID。

ID<-1:100
X<-round(runif(100,1,10))
data<-data.frame(ID,X)

如果我尝试提取它们

data$ID[data$X==c(3,4)]

我只提取一些等于3的ID和一些等于4的ID。它怎么可能?

2 个答案:

答案 0 :(得分:2)

您需要%in%而不是==。使用==只会匹配c(3,4)

的第一个元素
with(data, ID[X %in% c(3, 4)])

您还可以编写句子“......我需要从X中的值为3或4的所有元素中提取ID。”为逻辑语句

with(data, ID[X == 3 | X == 4])

答案 1 :(得分:1)

您可以尝试data.table二进制搜索

library(data.table)
setkey(setDT(data), X)[J(c(3, 4))]$ID

%between%

setDT(data)[X %between% c(3, 4)]$ID

为什么呢?因为效率,例如:

set.seed(123)
n <- 1e7
ID <- seq_len(n)
X <- round(runif(n, 1, 10))
data <- data.frame(ID, X)
library(data.table)
library(microbenchmark)

all.equal(setkey(setDT(data), X)[J(c(3,4))]$ID, with(data, ID[X %in% c(3, 4)]))
## [1] TRUE
all.equal(with(data, ID[X %in% c(3, 4)]), setDT(data)[X %between% c(3, 4)]$ID)
## [1] TRUE

data2 <- copy(data)


microbenchmark(DTbinsearch = setkey(setDT(data2), X)[J(c(3, 4))]$ID,
               DTbetween = setDT(data2)[X %between% c(3, 4)]$ID,
               Richard1 = with(data, ID[X %in% c(3, 4)]),
               Richard2 = with(data, ID[X == 3 | X == 4]))

# Unit: milliseconds
#        expr      min       lq     mean   median       uq      max neval
# DTbinsearch 101.8367 103.9708 119.3839 107.0190 120.0599 266.7725   100
#   DTbetween 322.0519 331.0178 352.8798 344.8267 373.1562 433.3817   100
#    Richard1 465.2885 476.6722 505.3128 492.8427 525.6999 657.7406   100
#    Richard2 521.2169 532.5552 554.0807 542.3962 573.8510 671.9143   100