【问题标题】:How to tell what is in one vector and not another?如何区分一个向量中的内容而不是另一个向量中的内容?
【发布时间】:2010-12-22 17:14:05
【问题描述】:

在 matlab 中,有一种方法可以在一个向量中找到值,但在另一个向量中却找不到。

例如:

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

是否有任何函数可以告诉我 x 中的值不在 y 中是 1?

【问题讨论】:

    标签: r vector


    【解决方案1】:

    您可以使用 setdiff()(设置差异)函数:

    > setdiff(x, y)
    [1] 1
    

    【讨论】:

    • 注意:setdiff(x,y)setdiff(y,x) 不一样。
    【解决方案2】:

    是的。对于向量,您可以简单地使用 %in% 运算符或 is.element() 函数。

    > x[!(x %in% y)]
    1
    

    对于矩阵,有许多不同的方法。 merge() 可能是最直接的。我建议looking at this question for that scenario

    【讨论】:

      【解决方案3】:

      R 中setdiff, union, intersect, setequal, and is.element 的帮助文件提供了有关 R 中标准集函数的信息。

      setdiff(x, y) 返回x 中不在y 中的元素。

      如上所述,这是一个不对称的差异。 比如:

      > x <- c(1,2,3,4)
      > y <- c(2,3,4,5)
      > 
      > setdiff(x, y)
      [1] 1
      > setdiff(y, x)
      [1] 5
      > union(setdiff(x, y), setdiff(y, x))
      [1] 1 5
      

      【讨论】:

        【解决方案4】:
        x[is.na(match(x,y))]
        

        【讨论】:

          【解决方案5】:

          setdiff() 是一个棘手的函数,因为输出取决于输入的顺序。您可以改为编写一个与intersect 完全相反的简单函数。这要好得多。

          >difference <- function(x, y) {
          c(setdiff(x, y), setdiff(y, x))
          }
          
          #Now lets test it. 
          >x <- c(1,2,3,4)
          >y <- c(2,3,4,5)
          
          >difference(x,y)
          [1] 1 5
          

          【讨论】:

            【解决方案6】:

            如果:

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

            以下任何一种表达方式:

            setdiff(x, y)
            x[!(x %in% y)]
            x[is.na(match(x,y))]
            x[!(is.element(x,y))]
            

            如果目标是在x 中找到y 中不存在的值/字符,会给你正确的答案[1] 1

            但是,应用上述表达式可能会很棘手,并且可能会根据向量的性质以及表达式中 x 和 y 的位置而产生不良结果。例如,如果:

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

            目标只是在x 中找到唯一值/字符,而y 中不存在,反之亦然。应用这些表达式中的任何一个仍然会给出正确答案[1] 1

            union(setdiff(x, y), setdiff(y, x))
            

            感谢Jeromy Anglim的贡献

            或者:

            difference <- function(x, y) {
            c(setdiff(x, y), setdiff(y, x))
            }
            difference(y,x)
            

            感谢Workhouse的贡献

            【讨论】:

              猜你喜欢
              • 2022-01-24
              • 2018-09-01
              • 1970-01-01
              • 2013-08-12
              • 2014-02-09
              • 2015-11-04
              • 2013-03-06
              • 2010-12-15
              相关资源
              最近更新 更多