Aqui eu tenho números inteiros 1:7
para quatro partições diferentes, ou seja, {1}, {2,3,4}, {5,6} e {7} e essas partições são escritas em uma lista, ou seja list(1,c(2,3,4),c(5,6),7)
,. Trato as partições como conjuntos, de modo que diferentes permutações de elementos em uma partição sejam reconhecidas como a mesma. Por exemplo, list(1,c(2,3,4),c(5,6),7)
e list(7,1,c(2,3,4),c(6,5))
são equivalentes.
Observe que, não há repetição para elementos na lista, por exemplo, não list(c(1,2),c(2,1),c(1,2))
, pois esse problema está discutindo partições exclusivas em todo o conjunto.
Listei algumas das diferentes permutações na lista lst
como abaixo
lst <- list(list(1,c(2,3,4),c(5,6),7),
list(c(2,3,4),1,7,c(5,6)),
list(1,c(2,3,4),7,c(6,5)),
list(7,1,c(3,2,4),c(5,6)))
e o que eu quero fazer é verificar se todas as permutações são equivalentes. Se sim, então obtemos resultado TRUE
.
O que eu fiz até agora é para classificar os elementos dentro de cada partição, e usado setdiff()
com interset()
e union()
julgá-lo (ver o meu código abaixo)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
No entanto, acho que esse método seria lento sempre que o tamanho da partição aumentar. Existe alguma abordagem mais rápida para fazer isso? Apreciado com antecedência!
- alguns casos de teste (dados pequenos)
# should return `TRUE`
lst1 <- list(list(1,c(2,3,4),c(5,6)),
list(c(2,3,4),1,c(5,6)),
list(1,c(2,3,4),c(6,5)))
# should return `TRUE`
lst2 <- list(list(1:2, 3:4), list(3:4, 1:2))
# should return `FALSE`
lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
lst_equal = list(list(1:2, 3:4), list(3:4, 1:2))
e também um onde o resultado deve ser FALSE
, talvezlst_false <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
FALSE
. Dessa forma, quando uma resposta funciona em alguns casos de teste, mas não em todos, é fácil diagnosticar o motivo. Quando há apenas um exemplo, você perde nuances nos resultados do teste. Também é bom adicionar novos exemplos em vez de alterar os exemplos existentes nas pessoas que já trabalharam neles.
lst
for potencialmente longo, você poderá obter eficiência com outras abordagens. Por exemplo, um primeiro cheque que length(unique(lengths(lst))) == 1
seria muito rapidamente voltar FALSE
se alguma das listas internas tem o número errado de elementos ....
lst
, comparando-o lst[[i]]
com lst[[1]]
, e assim você pode parar assim que encontrar uma incompatibilidade, em vez de fazer todas as comparações. Se lst
é longo FALSE
es são comuns, isso pode ser um grande ganho de eficiência, mas provavelmente não vale a pena.
Map
chamadas