【问题标题】:R: created a names vector containing the means of multiple numeric vectorsR:创建了一个包含多个数字向量均值的名称向量
【发布时间】:2018-05-20 14:36:27
【问题描述】:

我有 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的右侧参数中,“as.name”用于从“paste”的输出中删除引号。因此,传递给 assign 的第二个参数返回一个字符,该字符与我想要获得平均值的数字向量具有完全相同的名称,例如val_a。但我收到错误消息:

警告信息: 1:在 mean.default(as.name(paste("val", letters[j], sep = "_"))) 中: 参数不是数字或逻辑:返回 NA

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

【问题讨论】:

  • 试试get函数:get('val_a')

标签: r loops variables vector


【解决方案1】:

解决方案

要在bouncyball 的评论基础上获得完整答案,您可以这样做:

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

说明

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

示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2019-10-06
    • 2023-03-13
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多