2013-09-01 18 views
7

Mam listę list następującej postaci:wybrać podzbiór listy z listy list

[[1]] 
[[1]][[1]] 
[1] 0.4 
[[2]] 
[1] 0.3 
[[3]] 
[1] 9 
[[4]] 
[1] 10 
[[5]] 
[1] 0.4 

[[2]] 
[[2]][[1]] 
[1] 0.4 
[[2]] 
[1] 0.4 
[[3]] 
[1] 99 
[[4]] 
[1] 4 
[[5]] 
[1] 3 

[[3]] 
[[3]][[1]] 
[1] 0.3 
[[2]] 
[1] 0.3 
[[3]] 
[1] 2 
[[4]] 
[1] 08 
[[5]] 

... 

[[100]] 
[[100]][[1]] 
[1] 0.4 
[[2]] 
[1] 0.1 
[[3]] 
[1] 0 
[[4]] 
[1] 7 
[[5]] 

Chciałbym zaznaczyć wszystkie listy, które mają 0,4 cala ich [[i]][[1]].

To wybierz

[[i]][[1]]==0.4 

Wyniki byłoby:

[[1]] 
[[1]][[1] 
[1] 0.4 
[[2]] 
[1] 0.3 
[[3]] 
[1] 9 
[[4]] 
[1] 10 
[[5]] 
[1] 0.4 

[[2]] 
[[2]][[1]] 
[1] 0.4 
[[2]] 
[1] 0.4 
[[3]] 
[1] 99 
[[4]] 
[1] 4 
[[5]] 
[1] 3 
... 
[[100]] 
[[100]][[1]] 
[1] 0.4 
[[2]] 
[1] 0.1 
[[3]] 
[1] 0 
[[4]] 
[1] 7 
[[5]] 

można to zrobić bez for pętli czy coś?

Próbowałem wybrać [[i]][[1]]==0.4, ale zwraca ona tylko warunki prawdziwości. Co jeśli chcę wybrać na podstawie wielu warunków? Na przykład, [[i]][[1]]==0.4 & [[i]][[2]]==0.9

Odpowiedz

6

Można użyć coś takiego:

ll[which(sapply(ll, `[[`, 1) == .4)] 

Ale może napotkasz problemy pływających punktowych ....


Oto MRE:

list z 4 przedmiotami.

ll <- list(list(.4, 1), list(.1, 2), list(.3, 3), list(.4, 4)) 
# [[1]] 
# [[1]][[1]] 
# [1] 0.4 
# 
# [[1]][[2]] 
# [1] 1 
# 
# 
# [[2]] 
# [[2]][[1]] 
# [1] 0.1 
# 
# [[2]][[2]] 
# [1] 2 
# 
# 
# [[3]] 
# [[3]][[1]] 
# [1] 0.3 
# 
# [[3]][[2]] 
# [1] 3 
# 
# 
# [[4]] 
# [[4]][[1]] 
# [1] 0.4 
# 
# [[4]][[2]] 
# [1] 4 

Zastosuj Proponowane rozwiązanie:

ll[which(sapply(ll, `[[`, 1) == .4)] 
# [[1]] 
# [[1]][[1]] 
# [1] 0.4 
# 
# [[1]][[2]] 
# [1] 1 
# 
# 
# [[2]] 
# [[2]][[1]] 
# [1] 0.4 
# 
# [[2]][[2]] 
# [1] 4 

Dodawanie wielu warunków jest dość podobny:

ll[which(sapply(ll, `[[`, 1) == .4 & sapply(ll, `[[`, 2) == 1)] 
# [[1]] 
# [[1]][[1]] 
# [1] 0.4 
# 
# [[1]][[2]] 
# [1] 1 
+0

wielki to działa, jak mogę zmodyfikować kod, jeśli chcę wiele warunków być pełnowartościowym? – ghb

+0

@ user2733997, patrz aktualizacja. – A5C1D2H2I1M1N2O1R2T1

+0

Mam listę na liście, na liście na liście. Podział pierwszej listy na podstawie treści ostatniego działa w taki sam sposób jak opisany tutaj? Nie mogę znaleźć żadnego dobrego przykładu. – rdatasculptor