2013-12-15 4 views
6

У меня есть list списков и вы хотите проверить, все ли элементы этого list (которые имеют тип list) одинаковы. Как сделать это самым быстрым способом?Протестируйте, если все элементы списка (сами списки) равны

Обновление: здесь я приводил воспроизводимый пример. Дело в том, чтобы получить значение FALSE такого теста, поскольку два элемента eventual.list различны: eventual.list[[1]][[1]]data.frame имеет другие значения, чем eventual.list[[2]][[1]]data.frame.

Код:

a <- 1:3 
b <- 1:3 
c <- 2:4 

l1.el1 <- data.frame(a, b) 
l1.el2 <- a 
l1 <- list(l1.el1, 
      l1.el2) 

l2.el1 <- data.frame(a, c) 
l2.el2 <- a 
l2 <- list(l2.el1, 
      l2.el2) 

eventual.list <- list(l1, 
         l2) 
eventual.list 

Консоль вывода:

> eventual.list 
[[1]] 
[[1]][[1]] 
    a b 
1 1 1 
2 2 2 
3 3 3 

[[1]][[2]] 
[1] 1 2 3 


[[2]] 
[[2]][[1]] 
    a c 
1 1 2 
2 2 3 
3 3 4 

[[2]][[2]] 
[1] 1 2 3 
+0

Можете ли вы привести минимальный пример? Например, содержит ли список только одиночные числовые значения или векторы или какой-либо другой объект? – Thomas

+0

Привет, спасибо за внимание! Да, списки элементов должны содержать объекты разного типа, e.c. кадры данных, векторы и т. д. (см. пример, который я предоставил). –

ответ

18

Это канонический метод для определения всех элементов в списке, являются ли те же:

length(unique(object))==1 

В вашем случае :

> length(unique(eventual.list)) 
[1] 2 

> length(unique(eventual.list)) == 1 
[1] FALSE 

страница помощи для unique могло бы привести к мысли, что списки не будут обрабатываться, пока один не отражает этого результата, что меня удивило, когда я встретил его в первый раз:

is.vector(eventual.list) 
[1] TRUE 

Так списки технически векторы в R parlance, они просто не «атомные» векторы, они «рекурсивные».

> is.atomic(eventual.list) 
[1] FALSE 
> is.recursive(eventual.list) 
[1] TRUE 
+0

Он работает, спасибо! –

+0

Это хорошая идея. Торцевал мою голову над этим в течение получаса –

Смежные вопросы