我想检查两个向量是否包含相同的元素,即使它们没有按顺序排列。例如,函数(让我们称之为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:清除问题以省略初始答案,因为现在是我的实际答案。
答案 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
~~~具有相同的长度,从而避免频率计算。