尽管标题相似,但这与R中的Vectorizing rep和seq不同.
我的直接目标:给定一个向量,我想生成一个包含原始值的新向量,以及旧值中每个值之间的间隔间隔.这并不困难.
一种策略是使用更一般的函数,给定两个向量和指定的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
}
Run Code Online (Sandbox Code Playgroud)
例如:
> 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
Run Code Online (Sandbox Code Playgroud)
(这只是一个简单的例子.我真正想要的是用任意序列来做这件事,例如
-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
Run Code Online (Sandbox Code Playgroud)
我想将每个间隔细分为五个,以创建一个具有5倍元素的新序列.)
只要序列不是太长,我相信,反复延伸矢量不应该太慢.如果我需要大序列,我可以重写以预先扩展向量并填充它.但是,它仍然让我在循环中完成此操作.是否有更优雅,功能性的编程,R-ly方式?
谢谢.
dic*_*koa 15
在R中,向量化函数的最简单方法之一是使用该Vectorize函数.
基本上,你可以矢量化from的to参数,并把所有的起动器作为载体from的说法,为做同样的事情to的说法.
使用您的示例,您可以执行类似的操作
seq2 <- Vectorize(seq.default, vectorize.args = c("from", "to"))
c(seq2(from = c(1, 1.75), to = c(2, 2.75), by = 0.25))
## [1] 1.00 1.25 1.50 1.75 2.00 1.75 2.00 2.25 2.50 2.75
Run Code Online (Sandbox Code Playgroud)
尝试以下
x <- c(1, 2, 4, 8)
y <- unlist(mapply(FUN = function(from, to) {
seq(from = from, to = to, by = 0.25)
}, head(x, -1), tail(x, -1)))
y
## [1] 1.00 1.25 1.50 1.75 2.00 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75 6.00
## [24] 6.25 6.50 6.75 7.00 7.25 7.50 7.75 8.00
result <- y[!duplicated(y)]
result
## [1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75 6.00 6.25 6.50
## [24] 6.75 7.00 7.25 7.50 7.75 8.00
Run Code Online (Sandbox Code Playgroud)