我想确定列表是否包含任何重复元素,同时将排列视为等效。所有向量的长度相等。

实现这一目标的最有效方法(最短运行时间)是什么?

## SAMPLE DATA
a  <- c(1, 2, 3)
b  <- c(4, 5, 6)
a.same <- c(3, 1, 2)

## BOTH OF THSE LISTS SHOULD BE FLAGGED AS HAVING DUPLICATES
myList1 <- list(a, b, a)
myList2 <- list(a, b, a.same)


# CHECK FOR DUPLICATES
anyDuplicated(myList1) > 0  # TRUE
anyDuplicated(myList2) > 0  # FALSE, but would like true.

现在,我在检查重复项之前对列表中的每个成员进行排序
anyDuplicated( lapply(myList2, sort) ) > 0

我想知道是否有更有效的替代方法。此外,在 ?duplicated 文档中,它表示“将它用于列表可能会很慢”。还有其他更适合列表的函数吗?

最佳答案

那这个呢...?

a  <- c(1, 2, 3)
b  <- c(4, 5, 6)
a.same <- c(3, 1, 2)
myList1 <- list(a, b, a)
myList2 <- list(a, b, a.same)

# For exact duplicated values: List1
DF1 <- do.call(rbind, myList1)  # From list to data.frame
ind1 <- apply(DF1, 2, duplicated) # logical matrix for duplicated values
DF1[ind1] # finding duplicated values
[1] 1 2 3

# For permutations: List2
DF2 <- do.call(rbind, myList2)
ind2 <- apply(apply(DF2, 1, sort), 1, duplicated)
DF2[ind2] # duplicated values
[1] 3 1 2

10-08 13:22