2016-11-15 59 views
1

比方說,我有這兩個載體:如何根據條件將矢量拆分成R中的不等塊?

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

我怎麼可以拆分x成比的y每個元素更小的元素?例如:c(1,2) | c(4,6,7)。 。

我想一個選擇是做一個雙循環,並返回y中的最小元素,它小於xc(3,3,3,7,7)中的當前值。然後我可以使用這個矢量分割。

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

我覺得有一個更聰明的方法來做到這一點,但我無法弄清楚。

+1

嘗試'ifelse(X > Y [1],7,3)'。 –

回答

3

下面是使用splitfindInterval鹼R法:

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

$`0` 
[1] 1 2 

$`1` 
[1] 4 6 7 

findInterval函數返回分類變量值的向量在y中沿着你的標準。 split函數根據需要分離矢量並返回一個指定列表。

0

也許不是最好的解決方案,但它是更快:

z <- x < min(y) 

end <- x[z] 
4

這裏是我會怎麼做:

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

下面是結果:

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

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

在基礎R使用cutsplit

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)