我有超过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
有谁知道如何做到这一点?
答案 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