【问题标题】:R: Subset of vector for multiple matchesR:多个匹配的向量子集
【发布时间】: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 循环并逐个删除条目,但这会花费太长时间。有没有更好的方法来构建我想要的子集?

感谢所有帮助者!

【问题讨论】:

    标签: r vector subset


    【解决方案1】:

    只需使用通常的集合操作:

    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。
    • 没有。它返回 3 4 5 6 8
    • 是的,所以原始数据中只有一个 4 而不是 2(但它确实返回了其他数字 - 抱歉,我的评论中没有明确说明)。但是,无论如何,在示例数据中没有重复,所以你的答案是最好的(这就是我评论中“虽然”的意思,它遵循了赞成 ;-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多