2013-09-01 17 views
7

Ich habe eine Liste von Listen der folgenden Form:aus der Liste der Listen

[[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]] 

Ich möchte alle Listen auszuwählen, die 0,4 in ihren [[i]][[1]] haben.

Das heißt, wählen

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

Die Ergebnisse wäre:

[[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]] 

Kann dies ohne for Schleife oder etwas getan werden?

Ich habe versucht, [[i]][[1]]==0.4 auszuwählen, aber es gibt nur Wahrheitsbedingungen zurück. Was ist, wenn ich basierend auf mehreren Bedingungen auswählen möchte? Zum Beispiel [[i]][[1]]==0.4 & [[i]][[2]]==0.9

Antwort

6

Sie so etwas wie verwenden:

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

Aber Sie könnten laufen in Fließkomma Probleme ....


Hier ist ein MRE:

A list mit 4 Artikeln.

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 

Übernehmen Sie die vorgeschlagene Lösung:

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 

mehrere Bedingungen Hinzufügen ist ziemlich ähnlich:

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

groß das funktioniert, wie ich den Code ändern, wenn ich mehrere Bedingungen wollen erfüllt sein? – ghb

+0

@ user2733997, siehe Aktualisierung. – A5C1D2H2I1M1N2O1R2T1

+0

Ich habe eine Liste in einer Liste, in einer Liste in einer Liste. Die Unterteilung der ersten Liste basierend auf dem Inhalt der letzten funktioniert genauso wie hier beschrieben? Ich kann kein gutes Beispiel finden. – rdatasculptor