R:通过多个OR条件过滤

r7xajy2e  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(83)

我需要通过多个“OR”条件过滤一个嵌套框架。听我解释
我有一个包含100万个观察结果的矩阵(total)。其中一列(id)包含从1到6000的id号。这意味着许多行具有重复的id号。
我之前随机抽取了500个唯一的身份证号码。

random.id <- sample(abc, 500, replace=F)

我想过滤原始数据集中 id 列与 random.id 中的任何值匹配的那些行。换句话说,我想用许多“或”条件进行过滤。但是因为有500个条件,我不能把它们都打出来。
我试过使用%in%操作符。

filtered <- total %>%
  filter(id %in% random.id)

如果该命令按预期工作,则新的过滤框架应包含500个唯一的 id 值。

length(unique(filtered$id))

不幸的是,这个数字远远低于500。我重新为 random.id 做了随机样本,但是新的框架中唯一ID的数量总是在500以下。
我该怎么办?

wnrlj8wa

wnrlj8wa1#

由于您使用的是dplyr,下面是@Jon Spring在dplyr语法中的答案版本。
看起来您的问题确实与abc的内容有关。

library(dplyr)

random_id <- sample(1:1000, 500, replace = F)
total <- tibble(id = sample(1:6000, 1e6, replace = T))

filtered <- total %>% filter(id %in% random_id)

n_distinct(filtered$id) # 500

注意:dplyr::n_distinct省去了对lengthunique的两次调用。

qoefvg9y

qoefvg9y2#

你没有提到abc是从哪里来的,但是如果它有重复的,那么你可能实际上没有画出500个唯一的id号。
当你从一个有重复的向量中提取一个样本时,即使你不替换,一些样本本身也可能是重复的,因为你可能是在对同一个id的不同示例进行采样。
如果源分布本身有重复值,我们可以从样本中获得非唯一值而无需替换:

set.seed(0)
sample(c(1,1,2), size = 3, replace = FALSE)
[1] 1 1 2

或者用你的例子:

set.seed(0)
abc = sample(1:6000, size = 1E6, replace = TRUE)

length(unique(sample(abc, 500, replace=F)))
[1] 477

length(unique(sample(unique(abc), 500, replace=F)))
[1] 500
tkqqtvp1

tkqqtvp13#

我使用这个函数:

"%or%"=function(x,y) {  
          r=rep(F,length(x))
          for(i in y) r= r | sapply(x,function(x) x==i)  
          return(r)}

在您的案例中:

> abc=sample(1:10,100,replace=T)
> table(abc)
abc
 1  2  3  4  5  6  7  8  9 10 
13  7 10 11 15  5 13  7  8 11 
> random.id=sample(1:10,4)
> random.id
[1]  2  8  1 10
> y=abc[abc %or% random.id]
> table(y)
y
 1  2  8 10 
13  7  7 11

相关问题