我今天遇到了一个看似容易解决的问题。这让我头疼了一个多小时,我不知道如何解决这个问题而不必实现一个循环(这是耗时的,与优雅的编程相反)。
鉴于我有一组从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
现在我想从&#34;数据&#34;中排除这些值。向量。但如果我试试这个:
result <- data[-which(data==intersection)]
R告诉我
在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
- &GT;第一次进入&#34;十字路口&#34;已经走了(405)。
所以我可以按条目实现for循环和删除条目,但这需要太长时间。有没有更好的方法来构建我想要的子集?
感谢所有帮助者!
答案 0 :(得分:2)
只需使用常规的设置操作:
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