例如,我有一个包含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。它怎么可能?
答案 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