【问题标题】:Creating multiple new vectors from original vector从原始向量创建多个新向量
【发布时间】:2014-12-03 00:33:16
【问题描述】:

我有一个向量 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[length(m)] 处的 v 值,而不是所有与 m[1] 到 m[length(m)] 对应的向量 v。任何人都可以建议我解决这个问题的功能/方法吗?

在此先感谢

【问题讨论】:

  • 如果您发布输入数据和所需输出数据的(小而简化的!)示例,将会有所帮助。

标签: r


【解决方案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])] )

【讨论】:

  • 感谢@BondedDust,这非常有效,我可以用vres 做很多事情。我真的应该学习如何构建列表,因为在许多情况下它比循环更好。再次感谢您给了我很好的建议,帮助我改善了使用 R 的体验
【解决方案2】:

我尽量避免使用for 循环并改用apply 系列。您的函数会生成一堆不同长度的向量,我将它们组合成一个列表。数据框和矩阵都必须是偶数或非参差不齐的,所以我必须用NAs 填充你的向量,然后我对它们进行列绑定。

这行得通吗?

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)

【讨论】:

  • 感谢@RichardHerron,它完美地创建了矩阵 even1,每列都是从 d1 派生的新向量。但是当我尝试执行以下操作时:s&lt;-apply(even1,2,sum),它只会返回第一列的总和,并返回 NA 作为其余列的总和,因为其他列包含 NA。所以我尝试选择所有不是 NA 的元素:s&lt;-apply(even1,2,function(v) v[ !is.na(v) ] ) 并再次应用s&lt;-apply(even1,2,sum),但我仍然得到与以前相同的结果。
  • @Ocean 您需要将 na.rm = TRUE 作为选项传递给 sum()。你也可以使用 sapply(ragged, sum)。
  • @Richard Herron是的,我傻了,现在可以了。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多