R:多个匹配的向量子集

R:多个匹配的向量子集,r,vector,subset,R,Vector,Subset,今天我遇到了一个看似容易解决的问题。这让我头痛了一个多小时,我不知道如何在不实现循环的情况下解决这个问题(这很耗时,与优雅的编程相反) 假设我有一组从400到420的数字(“数据”)。然后是一个范围,由用户指定。该范围随后将成为数据的子集(“向量_子集”)。此外,还有一个带有要从数据中排除的数字的向量(“向量_减法”) 这就是我得到的: data <- seq(400,420) vector_subset <- seq(405,412) vector_substract <-

今天我遇到了一个看似容易解决的问题。这让我头痛了一个多小时,我不知道如何在不实现循环的情况下解决这个问题(这很耗时,与优雅的编程相反)

假设我有一组从400到420的数字(“数据”)。然后是一个范围,由用户指定。该范围随后将成为数据的子集(“向量_子集”)。此外,还有一个带有要从数据中排除的数字的向量(“向量_减法”)

这就是我得到的:

data <- seq(400,420)
vector_subset <- seq(405,412)
vector_substract <- c(402,403,404,405,408,409,412,413,414)
现在我想从“数据”向量中排除这些值。但如果我尝试这样做:

result <- data[-which(data==intersection)]
结果“交叉点”的第一个条目消失(405)

所以我可以实现for循环并逐个删除条目,但这会花费太长时间。有没有更好的方法来构建我想要的子集


谢谢大家的帮助

只需使用通常的设置操作:

setdiff(data, intersect(vector_subset, vector_substract))
#[1] 400 401 402 403 404 406 407 410 411 413 414 415 416 417 418 419 420

虽然它假定您希望保留的前一个数据中没有重复项,例如
setdiff(c(1:4,4:8),但c(1,2,7))
只会返回一个4.no。它返回3 4 5 6 8是,因此在原始数据中只返回一个4而不是2(但它确实返回了其他数字-抱歉,我的评论中没有明确说明)。但是,无论如何,在示例数据中没有重复数据,因此您的答案是最好的(这就是我的评论中“虽然”的意思,它紧跟着upvote;-)
result <- data[-which(data==intersection)]
result <- data[-which(data==intersection[1])]
> result
 [1] 400 401 402 403 404 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
setdiff(data, intersect(vector_subset, vector_substract))
#[1] 400 401 402 403 404 406 407 410 411 413 414 415 416 417 418 419 420