带约束的向量中的数字元素

时间:2014-03-02 06:40:32

标签: r lapply seq

鉴于xy,我希望在下面创建desired.result

x <- 1:10

y <- c(2:4,6:7,8:9)

desired.result <- c(1,2,2,2,3,4,4,5,5,6)

实际上y中的每个序列在x中被y中序列中的第一个元素替换为x的元素。编号。

x的中间步骤是:

x.intermediate <- c(1,2,2,2,5,6,6,8,8,10)

以下是执行此操作的代码。但是,代码不是通用的,而且过于复杂:

x <- 1:10

y <- list(c(2:4),(6:7),(8:9))

unique.x <- 1:(length(x[-unlist(y)]) + length(y))

y1 <- rep(min(unlist(y[1])), length(unlist(y[1])))
y2 <- rep(min(unlist(y[2])), length(unlist(y[2])))
y3 <- rep(min(unlist(y[3])), length(unlist(y[3])))

new.x <- x

new.x[unlist(y[1])] <- y1
new.x[unlist(y[2])] <- y2
new.x[unlist(y[3])] <- y3

rep(unique.x, rle(new.x)$lengths)

 [1] 1 2 2 2 3 4 4 5 5 6

以下是我尝试概括代码的方法。但是,我被困在第二个lapply

x <- 1:10

y <- list(c(2:4),(6:7),(8:9))

unique.x <- 1:(length(x[-unlist(y)]) + length(y))

y2 <- lapply(y, function(i) rep(min(i), length(i)))

new.x <- x

lapply(y2, function(i) new.x[i[1]:(i[1]-1+length(i))] = i)

rep(unique.x, rle(new.x)$lengths)

感谢您的任何建议。我怀疑我忽略了一个更简单的解决方案。我更喜欢基础R中的解决方案。

1 个答案:

答案 0 :(得分:2)

这样的解决方案应该有效:

x <- 1:10
y <- list(c(2:4),(6:7),(8:9))

x[unlist(y)]<-rep(sapply(y,'[',1),lapply(y,length))

rep(1:length(rle(x)$lengths), rle(x)$lengths)

## [1] 1 2 2 2 3 4 4 5 5 6