【发布时间】:2013-04-01 18:51:36
【问题描述】:
尽管标题相似,但这与Vectorizing rep and seq in R 不是同一个问题。
我的直接目标:给定一个向量,我想生成一个新向量,其中包含原始值以及旧值中每个值之间的规则间隔。这并不难。
一种策略是使用更通用的函数,给定两个向量和指定的by 区间,使用相同的by 值重复将 seq 应用于两个原始向量中的数字对。我还没有找到执行此操作的内置函数。 seq 似乎拒绝将向量作为参数处理。这是一个执行更一般操作的函数(然后我可以立即使用它):
multiseq <- function(froms, tos, by){
x <- c();
for (i in seq_along(froms)){
x <- c(x, seq(from=froms[i], to=tos[i], by=by))
}
x
}
例如:
> multiseq(1:2, 1.75:2.75, .25)
[1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75
(这只是一个简单的例子。我真正想要的是用任意序列来做这个,例如
-0.89115386 -0.75346155 -0.61576924 -0.47807693 -0.34038463 -0.20269232 -0.06500001 0.07269230 0.21038460 0.34807691 0.48576922 0.62346153 0.76115383
我想将每个间隔细分为五个,以创建一个包含 5 倍多的元素的新序列。)
只要序列不太长,我相信重复扩展向量不应该太慢。如果我需要大序列,我可以重写以预先扩展向量并填充它。然而,我仍然用循环来做这件事。有没有更优雅的函数式编程 R-ly 方式?
谢谢。
【问题讨论】:
-
我没有得到你想要的
seq(1, 2.75, by=.25)做同样的事情吗? -
谢谢@TylerRinker。我已经编辑澄清。嗯,但现在我想,你是对的。我只是没有正确地考虑它。对于新示例,我可以使用
seq(-0.89115386, 0.76115383, 0.1376923/5)。我也意识到我可以使用c(mapply(seq, firstseq, secondseq, MoreArgs=list(by=0.1376923/5))。不确定是撤回问题还是回答。 -
回答它并接受您的回答,这是完全有效的(尽管您必须等待几天才能接受它)。我正要提出同样的建议。
multiseq <- function(froms, tos, ...) as.vector(mapply(seq, froms, tos, ...)),然后做multiseq(froms, tos, by=0.1)(比如说)。
标签: r