2017-10-03 2 views
2

Angenommen, wir haben einen Wert y = 4 und eine Liste von Vektoren, ich möchte überprüfen, ob dieser Wert zu einem Vektor in der Liste gehört, wenn ja, ich werde diesen Wert zu allen Elementen von Vektoren hinzufügen.Wie überprüft man, ob der angegebene Wert zu den Vektoren in der Liste gehört?

y<-4 
M<- list(c(1,3,4,6) , c(2,3,5), c(1,3,6) ,c(1,4,5,6)) 

> M 
[[1]] 
[1] 1 3 4 6 

[[2]] 
[1] 2 3 5 

[[3]] 
[1] 1 3 6 

[[4]] 
[1] 1 4 5 6 

Die Ergebnisse werden ähnlich sein:

> R 
    [[1]] 
    [1] 5 7 8 10 

[[2]] 
[1] 5 8 9 10 
+0

Dann werden die Listenelemente ohne 4 gelöscht? – lmo

+0

Ja, ich möchte nur die Vektoren erhalten Wert 4 und diesen Wert zu ihren Elementen hinzufügen. – Noor

Antwort

3

Wir können keep verwenden, die nur Elemente, die ein Prädikat erfüllen hält. In diesem Fall werden nur die Vektoren beibehalten, die y enthalten.

Wir fügen dann y zu jedem der Vektoren hinzu.

library('tidyverse') 

keep(M, ~y %in% .) %>% 
    map(~. + y) 
+0

danke, Paul für Ihre Antwort. – Noor

1

Hier ist eine Methode, mit lapply und Funktionen einstellen.

# loop through M, check length of intersect 
myList <- lapply(M, function(x) if(length(intersect(y, x)) > 0) x + y else NULL) 
# now subset, dropping the NULL elements 
myList <- myList[lengths(myList) > 0] 

diese zurück

myList 
[[1]] 
[1] 5 7 8 10 

[[2]] 
[1] 5 8 9 10 
3

Hier ist ein einfacher hacky Weg, dies zu tun:

lapply(M[sapply(M, function(x){y %in% x})],function(x){x+y}) 

Rückkehr:

[[1]] 
[1] 5 7 8 10 

[[2]] 
[1] 5 8 9 10 

Logic: wir e sapply um herauszufinden, welche Teile von M eine 4 in, dann fügen Sie 4 zu denen mit lapply

3

Sie können dies tun mit ...

lapply(M[sapply(M, `%in%`, x=y)], `+`, y) 

[[1]] 
[1] 5 7 8 10 

[[2]] 
[1] 5 8 9 10 
+1

Dies ist eine sauberere (vielleicht mehr esoterische) Version von Michael-Birds Antwort. – lmo

0

Wow! Jeder hat großartige Antworten gegeben, einschließlich der Verwendung der Kartenfunktionalität.

Map("+",M[unlist(Map("%in%", y,M))],y) 

[[1]] 
[1] 5 7 8 10 

[[2]] 
[1] 5 8 9 10 
Verwandte Themen