在R语言中,基于另一个向量的值生成重复值向量

4

样例数据

batch <- c(rep(1,3), rep(2,4), rep(3,5))
batch
[1] 1 1 1 2 2 2 2 3 3 3 3 3

alpha <- c(0.05, 0.04, 0.03)

问题陈述

我想创建一个向量,例如alphai,它会重复第i个元素的alpha在给定值的batch中出现的次数(例如,对于batch = 1,应将alpha的第1个值重复出现1次)。期望的输出应该像这样:

alpha
[1] 0.05 0.05 0.05 0.04 0.04 0.04 0.04 0.03 0.03 0.03 0.03 0.03

请提供仅基于R语言的解决方案,谢谢!
编辑:我希望所提供的代码能够在批处理情况下工作,其中批处理可以是非递增序列或不连续序列(例如1、3、4、5等)。
batch2 <- c(rep(1,3), rep(3, 4), rep(4,5))
batch2
[1] 1 1 1 3 3 3 3 4 4 4 4 4

alpha 应该仍然保持不变。

[1] 0.05 0.05 0.05 0.04 0.04 0.04 0.04 0.03 0.03 0.03 0.03 0.03

2
顺便说一下,可以通过以下方式创建batchrep(1:3,3:5) - markus
好的了解,谢谢! - latlio
2个回答

4

索引可用于复制。在R中,索引从1开始。因此,如果我们指定多个1,则从第一个位置多次提取'alpha'对象中的元素,其他索引同理。请注意,0的索引将被跳过,因为没有元素。

alpha[batch]

1
@latlio 最好提供一个更一般的例子,因为当有人回答问题时,它是基于所提供的例子。 - akrun
1
我起初接受了你的答案,但我并不是很了解SO的礼仪。然而,我无法预见到这种极端情况,@Ronak Shah的解决方案让我意识到了这种边缘情况,所以他的答案(尽管我没有提供一般性的例子)最终变得更具有普适性。你的答案比他的更“正确”还是他的比你的更“正确”?我希望我能够接受两个答案。如果我编辑问题以包括一个更一般的情况,你会改变你的投票吗?只是想知道SO的礼仪是什么,以及投票实际上意味着什么。 - latlio
好的,我想知道SO的礼仪是否会要求您编辑您的解决方案,以包括一般情况,即 alpha [match(batch,sort(unique(batch))],然后我会接受您的答案,因为我希望指向未来遇到这个问题的SO用户选择最通用和直接的解决方案,而且因为我最初已经接受了您的答案。 - latlio
1
@latlio 没关系。 在选择通用解决方案与适用于示例的解决方案之间总会存在权衡。 在这种情况下,我选择了这个方案,因为它非常紧凑,并且我假设您的情况基于示例很好地适合它。 如果示例更普遍一些,我会想出不同的解决方案。 我的观点并不是接受解决方案。 您可以选择最适合您的任何解决方案。 - akrun

3

另一种方法是使用reptable

rep(alpha, table(batch))
#[1] 0.05 0.05 0.05 0.04 0.04 0.04 0.04 0.03 0.03 0.03 0.03 0.03

这在batch不遵循1:3的顺序时会很有帮助。例如,
batch <- rep(10:8, 3:5)
batch
#[1] 10 10 10  9  9  9  9  8  8  8  8  8

rep(alpha, table(batch))
#[1] 0.05 0.05 0.05 0.05 0.05 0.04 0.04 0.04 0.04 0.03 0.03 0.03

谢谢,这实际上是一个更通用的解决方案。通常,批次应该从数据中的1开始排序,但在“愚蠢”用户的边缘情况下,这个解决方案可以覆盖它! - latlio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接