【问题标题】:Matching two vectors with mapply to create sequences使用 mapply 匹配两个向量以创建序列
【发布时间】:2015-10-28 21:59:55
【问题描述】:

给出了两个向量,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))] &lt;- 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(function(a, b){vec[a:b] &lt;&lt;- 1000},a,b)。但是,unlist 方式更好——如果你能提供帮助,你通常不想使用全局赋值 &lt;&lt;-
  • @jeremycg 是的,这主要是可行的,但在此过程中它会在控制台上打印 3 x 1000。作为替代方案,我尝试将 vec 作为参数传递给 mapply,但由于长度不同,该函数不再正常工作并创建了很多 NA。
  • mapply 不太适合这项任务 - 你会得到 3 个结果,因为 ab 是 3 长。如果您真的想在那里申请,请尝试vec[unlist(sapply(1:length(a), function(x) seq(from = a[x], to = b[x])))]&lt;-1000,但这只是上面转换为sapplyMap答案
  • @jeremycg 好的,非常感谢,这是我未来需要知道的

标签: r scope sequence mapply


【解决方案1】:

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

【讨论】:

  • 好的,我明白了。是否可以通过完全使用 apply 来实现所需的输出(1 个向量)(无需定义上面建议的全局变量)?
【解决方案2】:

感谢 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多