R:创建了一个包含多个数字向量均值的名称向量

时间:2017-12-06 16:22:10

标签: r loops variables vector

我有超过20个由一系列值组成的数字向量。每个向量用字母区分,例如val_a,val_b,val_c等...

我想将每个这些向量的均值放入一个命名向量中。我当然可以这样费力地做到这一点:

obs <- c("val_a" = round(mean(val_a),3),
         "val_b" = round(mean(val_b),3),
         "val_c" = round(mean(val_c),3))

但是有了20个向量,那么写出来就变得乏味了,更不用说一个不优雅的解决方案了。如何以更简洁的方式创建命名向量?我尝试使用for循环,如下所示:

obs <- c(for (j in 1:20) {
  assign(paste("val",letters[j], sep = "_"), 
  mean(as.name(paste('val',letters[j], sep = '_'))),)
})

在传递给assign的右手参数中,&#34; as.name&#34;用于从&#34;粘贴&#34;的输出中删除引号。因此传递给assign的第二个参数返回一个字符,该字符与我想要的数字向量具有完全相同的名称,例如, val_a。但我得到错误消息:

警告讯息: 1:在mean.default中(as.name(粘贴(&#34; val&#34;,字母[j],sep =&#34; _&#34;))):   参数不是数字或逻辑:返回NA

有谁知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

解决方案

要建立bouncyball的评论,以便您有完整的答案,您可以这样做:

sapply(paste('val', letters[1:20], sep='_'), function(x) round(mean(get(x)), 3))

解释

对于您的环境中名为x的对象,get("x")将返回x。见help("get")。然后我们可以使用paste('val', letters[1:20], sep='_')sapply()的每个元素执行此操作,或者如果您愿意,可以使用循环。

实施例

val_a <- rnorm(100)
val_b <- rnorm(100)
val_c <- rnorm(100)

sapply(paste('val', letters[1:3], sep='_'), function(x) round(mean(get(x)), 3))

      val_a       val_b       val_c 
-0.09328504 -0.15632654 -0.09759111