代码之家  ›  专栏  ›  技术社区  ›  Yorgos

如何得到向量x中向量y的补

  •  4
  • Yorgos  · 技术社区  · 16 年前

    那是 x \ y 使用数学符号。假设

    x <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,1,3) 
    y <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
    

    我怎样才能得到一个向量,它的x中的所有值都不在y中,也就是说,结果应该是:

    2,1,1,3
    

    有一个类似的问题 here . 但是,没有一个答案返回我想要的结果。

    3 回复  |  直到 12 年前
        1
  •  7
  •   teucer    16 年前

    这里有一个使用 pmatch (根据您的要求提供“补语”:

    x <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,1,3)
    y <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
    res <- x[is.na(pmatch(x,y))]
    

    火柴 文档:

    如果duplicates.ok为False,则在搜索后续匹配项时将排除表的值。

        2
  •  4
  •   Dirk is no longer here    16 年前

    这个怎么样:

    R> x[x!=y]
    [1] 2 1 1 1 3
    Warning message:
    In x != y : longer object length is not a multiple of shorter object length
    R>
    

    我认为,这是一个困难的问题,因为你在混合价值观和立场。更简单的解决方案依赖于r中的“set”函数之一:

    R> setdiff(x,y)
    [1] 2 3
    

    但这只使用价值观,而不是立场。

    我给你的答案有一个问题,那就是回收利用的含蓄使用以及由此引发的警告:作为 x 比你的 y ,的前几个值 Y 得到重用。但是当长向量的长度是短向量长度的整数倍时,循环被认为是“干净的”。但情况并非如此,因此我不确定我们能否彻底解决你的问题。

        3
  •  3
  •   Jonathan Chang    16 年前

    如果我明白这个问题,你可以用 table 计算每个集合中元素数量的差异,然后根据这些计数的差异创建一个向量(注意,这不一定会给你在问题中给出的顺序)。

    > diffs <- table(x) - table(factor(y, levels=levels(factor(x))))
    > rep(as.numeric(names(diffs)), ifelse(diffs < 0, 0, diffs))
    [1] 1 1 2 3