2016-11-15 8 views
1

Lassen Sie uns sagen, ich habe diese beiden Vektoren:Wie teilt man einen Vektor in ungleiche Stücke in R basierend auf einer Bedingung auf?

x <- c(1,2,4,6,7) 
y <- c(3,7) 

Wie kann ich geteilt x in die Elemente, die als jedes Element von y kleiner sind? Zum Beispiel: c(1,2) | c(4,6,7). .

Ich denke, eine Möglichkeit wäre, eine doppelte Schleife zu tun, und das kleinste Element in y zurück, die in x kleiner ist als die aktuelle ist: c(3,3,3,7,7). Ich könnte dann mit diesem Vektor teilen.

j <- 1 
sapply(x, function(i){ 
    if (i <= y[j]) { 
    y[j] 
    } else { 
    if (j < length(y)){ 
     j <- j + 1 
    } 
    y[j] 
    } 
}) 

Ich fühle mich wie ein cleverer Weg, dies zu tun, aber ich kann es nicht herausgefunden.

+1

Try 'ifelse (x > y [1], 7,3) '. –

Antwort

3

Hier ist eine Methode, Basis R mit split und findInterval:

split(x, findInterval(x, y, rightmost.closed=TRUE)) 

$`0` 
[1] 1 2 

$`1` 
[1] 4 6 7 

Die findInterval Funktion einen Vektor zurückgibt, der die Variablenwerte stuft in x nach deinen Kriterien in y. Die split Funktion trennt den Vektor wie gewünscht und gibt eine benannte Liste zurück.

0

vielleicht nicht die beste Lösung, aber es ist schneller:

z <- x < min(y) 

end <- x[z] 
4

Hier ist, wie ich es tun würde:

x <- c(1,2,4,6,7) 
y <- c(3,7) 
out <- list(x[x < min(y)], x[!x < min(y)]) 

Hier ist das Ergebnis:

> out 
[[1]] 
[1] 1 2 

[[2]] 
[1] 4 6 7 
2

Mit cut und split in Basis R:

lapply(y, function(a) split(x, cut(x, c(-Inf, a, Inf)))) 

# [[1]] 
# [[1]]$`(-Inf,3]` 
# [1] 1 2 

# [[1]]$`(3, Inf]` 
# [1] 4 6 7 


# [[2]] 
# [[2]]$`(-Inf,7]` 
# [1] 1 2 4 6 7 

# [[2]]$`(7, Inf]` 
# numeric(0) 
Verwandte Themen