检查两个向量是否在R中包含相同(无序)的元素

时间:2015-01-12 23:53:16

标签: r

我想检查两个向量是否包含相同的元素,即使它们没有按顺序排列。例如,函数(让我们称之为SameElements)应满足以下条件:

SameElements(c(1, 2, 3), c(1, 2, 3))  # TRUE
SameElements(c(1, 2, 3), c(3, 2, 1))  # TRUE
SameElements(c(1, 2, 1), c(1, 2))  # FALSE
SameElements(c(1, 1, 2, 3), c(3, 2, 1))  # FALSE

编辑1:指定当向量包含相同元素但频率不同时,该函数应返回F.

编辑2:清除问题以省略初始答案,因为现在是我的实际答案。

5 个答案:

答案 0 :(得分:34)

我认为您可以使用setequal(a,b)

更新更新 setequal检查两个向量是否由相同的元素组成,但不检查这些元素在每个向量中是否具有相同的出现次数。

答案 1 :(得分:10)

代替更清洁的替代方案,这就是已知的解决方案:

SameElements <- function(a, b) return(identical(sort(a), sort(b)))
SameElements(c(1, 2, 3), c(1, 3, 2))  # TRUE
SameElements(c(1, 2, 3), c(1, 1, 3, 2))  # FALSE

根据nrussell的建议修改:identical而不是all.equal(...) == T

答案 2 :(得分:4)

您可能对&#34;比较&#34;感兴趣包。这个答案演示了compare()功能,但对于您的情况,您可以使用compareIgnoreOrder()(与您的问题的标题几乎完全匹配)。{/ p>

有几个参数可以作为转换添加,在尝试比较元素时应该允许这些参数。在下面的示例中(为了节省一些输入),我已经要求函数允许所有转换(allowAll = TRUE),但更改向量长度(shorten = FALSE)除外。

library(compare)
compare(A1, A2, allowAll = TRUE, shorten = FALSE)
# TRUE
compare(A1, A3, allowAll = TRUE, shorten = FALSE)
# TRUE
#   sorted
compare(A1, A4, allowAll = TRUE, shorten = FALSE)
# FALSE
#   sorted
compare(B1, B2, allowAll = TRUE, shorten = FALSE)
# FALSE
#   sorted
compare(B1, A4, allowAll = TRUE, shorten = FALSE)
# FALSE
#   sorted
compare(A3f, A1, allowAll = TRUE, shorten = FALSE)
# TRUE
#   coerced from <numeric> to <factor>
#   sorted

示例数据:

A1 <- c(1, 2, 3); A2 <- c(1, 2, 3)
A3 <- c(3, 2, 1); A4 <- c(1, 1, 2, 3)
B1 <- c(1, 2, 1); B2 <- c(1, 2)
A3f <- factor(A3)

答案 3 :(得分:0)

这是我的解决方案:

SameElements <- function (a,b){
  l <- Map(table,list(a, b)) # Compute frequencies - returns ordered table
  Reduce(identical,l) # Check if frequencies are the same for all input vectors
}

SameElements(c(1, 2, 3), c(1, 2, 3))  # TRUE
SameElements(c(1, 2, 3), c(3, 2, 1))  # TRUE
SameElements(c(1, 2, 1), c(1, 2))  # FALSE
SameElements(c(1, 1, 2, 3), c(3, 2, 1))  # FALSE

正如您所看到的,只要将它们全部放在列表中,它就适用于任意数量的输入向量。

一个班轮:

Reduce(identical,Map(table,listOfVectors))

答案 4 :(得分:0)

基本上,您可以在以下步骤中概述您的问题:

if not same unique values: return FALSE
else if same Frequencies: return TRUE
    else return True

在正确的R代码中:

SameElements = function(v1, v2)
{
  tab1 = table(v1) ; tab2 = table(v2)
  if( !all(names(tab1) == names(tab2)) ) return(FALSE) # Same unique values test
  return(all(tab1==tab2)) # Same frequencies test
}

一些例子:

v1 = c(1, 2, 3)
v2 = c(3, 2, 1)
SameElements(v1, v2) # TRUE as both uniqueness and frequencies test are verified

v1 = c(1,1, 2,3)
v2  =c(3,2,1)
S

ameElements(v1,v2)#FALSE违反频率测试

PS:i)您可以!all()替换any() ~~~ ii)为了加快代码的速度,当两个向量没有时,你可以快速返回FALSE ~~~具有相同的长度,从而避免频率计算。