使用mapply匹配两个向量以创建序列

时间:2015-10-28 21:59:56

标签: r scope sequence mapply

给出了两个向量,ab。载体包含各种序列的起始点(a)和终点(b)。应在目标向量vec中将这些序列设置为1000。我试图将mapply用于此目的,但结果并不像预期的那样。

a <- c(2,10,15)
b <- c(4,13,18)
vec <- sample(1:18,18)

mapply(function(a, b){
  vec[a:b] <- 1000; vec
},a,b)

我知道我可以从另一个帖子做vec[unlist(Map(":", a, b))] <- 1000,但我想了解更多关于mapply以及为什么它在这种情况下无法正常工作。

结果以矩阵而不是矢量的形式出现,即更改不会保存到原始矢量中。怎么可以这样做?可能是一个简单的修复(但我无法弄清楚文档中的任何内容或其他任何地方)

      [,1] [,2] [,3]
[1,]   13   13   13
[2,] 1000    2    2
[3,] 1000   17   17
[4,] 1000   12   12
[5,]   14   14   14
[6,]    9    9    9
[7,]   16   16   16
[8,]    4    4    4
[9,]   15   15   15
[10,]   18 1000   18
[11,]    6 1000    6
[12,]    3 1000    3
[13,]   11 1000   11
[14,]    1    1    1
[15,]   10   10 1000
[16,]    7    7 1000
[17,]    5    5 1000
[18,]    8    8 1000

2 个答案:

答案 0 :(得分:0)

mapply同时运行ab并生成一系列结果。此序列的长度等于ab的长度。在这种情况下,它是三个向量的序列,即具有3列的矩阵。

答案 1 :(得分:0)

归功于jeremycg。

有三种方法可以做到:

1)如上所述,取消列出。可能是最好的方法

vec[unlist(Map(":", a, b))] <- 1000

2)使用全局作业

mapply(function(a, b){vec[a:b] <<- 1000},a,b)

3)使用apply

vec[unlist(sapply(1:length(a), function(x) seq(from = a[x], to = b[x])))]<-1000