我有一个向量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)]。任何人都可以建议我一个功能/解决这个问题的方法吗?
非常感谢提前
答案 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])] )