【发布时间】:2015-09-16 01:16:48
【问题描述】:
我今天遇到了一个看似容易解决的问题。这让我头疼了一个多小时,我不知道如何在不实现循环的情况下解决这个问题(这很耗时,而且与优雅的编程相反)。
假设我有一组从 400 到 420 的数字(“数据”)。然后有一个范围,由用户指定。该范围稍后将成为数据的子集(“vector_subset”)。此外,还有一个带有数字的向量要从数据中排除(“vector_substract”)。
这是我得到的:
data <- seq(400,420)
vector_subset <- seq(405,412)
vector_substract <- c(402,403,404,405,408,409,412,413,414)
现在我想找出我需要提取哪些元素,因为它们都在用户子集向量和减法向量中:
intersection <- intersect(vector_subset, vector_substract)
这很好用:
> intersection
[1] 405 408 409 412
现在我想从“数据”向量中排除这些值。但如果我试试这个:
result <- data[-which(data==intersection)]
R告诉我
在数据 == 交集: 较长的对象长度不是较短对象长度的倍数
如果我一次删除一个元素,它可以正常工作。喜欢:
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
-> "intersection" 的第一个条目消失了 (405)。
所以我可以实现一个 for 循环并逐个删除条目,但这会花费太长时间。有没有更好的方法来构建我想要的子集?
感谢所有帮助者!
【问题讨论】: