从原始向量创建多个新向量

时间:2014-12-03 00:33:17

标签: r

我有一个向量d,我从d创建新的向量,使得新向量包含d的每个第m个元素:

v<-d[seq(1,length(d),m)]

下一步我想计算总和

s<-sum(abs(v[1:(length(v)-1)]-v[2:length(v)]))

如果我用很少的m值来做这个就没问题了。但是,如果我的m值超过50,那么逐个执行此操作将不是理想的方法。我想到推广创建对应不同m值的v的方式。以下是我提出的代码:

d1<-rnorm(20)
m<-seq(1,10,1)
v<-matrix(rep(0,length(d1)*lenght(m)),nrow=length(m))
for (i in 1:length(m)){v[i,]<-d1[seq(1,length(d1),m[i])]}

但是当我运行代码时,会出现以下错误:

Error in v[i, ] <- d1[seq(1, length(d1), m[i])] : 
number of items to replace is not a multiple of replacement length

所以我尝试了另一种方式:

v<-rep(0,length(d1))
for (i in 1:length(m)){v<-d1[seq(1,length(d1),m[i])]}

但是这段代码只给出了m的值m = m [length(m)],而不是所有的矢量v对应于m [1]到m [length(m)]。任何人都可以建议我一个功能/解决这个问题的方法吗?

非常感谢提前

2 个答案:

答案 0 :(得分:1)

我尝试避免for循环,而是使用apply系列。你的函数生成了一堆不同长度的向量,我将它组合成一个列表。数据框和矩阵都必须是偶数或非参差不齐的,所以我必须用NA s填充矢量,然后我用列绑定它们。

这有用吗?

set.seed(2001)
d1 <- rnorm(20)
m <- seq(1, 10, 1)
ragged <- lapply(m, FUN=function(x) d1[seq(1, length(d1), x)]) 
maximum <- max(sapply(ragged, length))
even <- lapply(ragged, FUN=function(x) {
               xx <- rep(NA, maximum)
               xx[seq(length(x))] <- x
               xx
})
even1 <- do.call(cbind, even)

答案 1 :(得分:1)

我想你可能正试图这样做:

for (i in 1:length(m)){assign(paste0("v",i), d1[ seq(1, length(d1), m[i])] }

我的建议......不要。您应该学习构建列表:

vres <- lapply( seq_along(m) , 
                  function(i) d1[ seq(1, length(d1), m[i])] )