2016-11-15 76 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)