使用 mapply 匹配两个向量以创建序列
Matching two vectors with mapply to create sequences
给出了两个向量,a
和 b
。向量包含各种序列的起点 (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
mapply
同时运行 a
和 b
并生成一系列结果。这个序列的长度等于a
和b
的长度。在这种情况下,它是三个向量的序列,即具有 3 列的矩阵。
感谢 jeremycg。
有 3 种方法可以做到:
1) 取消列表,如前所述。可能是最好的方法
vec[unlist(Map(":", a, b))] <- 1000
2) 使用全局赋值
mapply(function(a, b){vec[a:b] <<- 1000},a,b)
3) 使用应用
vec[unlist(sapply(1:length(a), function(x) seq(from = a[x], to = b[x])))]<-1000
给出了两个向量,a
和 b
。向量包含各种序列的起点 (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
mapply
同时运行 a
和 b
并生成一系列结果。这个序列的长度等于a
和b
的长度。在这种情况下,它是三个向量的序列,即具有 3 列的矩阵。
感谢 jeremycg。
有 3 种方法可以做到:
1) 取消列表,如前所述。可能是最好的方法
vec[unlist(Map(":", a, b))] <- 1000
2) 使用全局赋值
mapply(function(a, b){vec[a:b] <<- 1000},a,b)
3) 使用应用
vec[unlist(sapply(1:length(a), function(x) seq(from = a[x], to = b[x])))]<-1000