【问题标题】:Loop through string variable names in R循环遍历 R 中的字符串变量名
【发布时间】:2021-01-15 23:23:25
【问题描述】:

我必须做一百次以下计算,从 art1 开始,到 art250 结束:

sd_art1_2008 <- sd(c(art1_1_2008,art1_2_2008,art1_3_2008,art1_4_2008,art1_5_2008,art1_6_2008,art1_7_2008,art1_8_2008,art1_9_2008))

sd_art2_2008 <- sd(c(art2_1_2008,art2_2_2008,art2_3_2008,art2_4_2008,art2_5_2008,art2_6_2008,art2_7_2008,art2_8_2008,art2_9_2008)) ……等等……

我试图通过这个互动

   paste("sd_art",i,"_2008", sep="") <-sd(c("art",i,"_1_2008","art",i,"_2_2008")))
   }

,但它错误。有谁可能知道如何解决这个问题? 最好的问候,丹尼尔

【问题讨论】:

  • 嗨,欢迎来到 SO! 1)您使用 paste 而不是 paste0 在这里不起作用,因为 paste 在没有进一步的参数的情况下会添加 paste0 不会的空格。 2)您尝试在不需要的地方生成名称,3)您使用粘贴命令创建名称,但不用于实际数据->如果它应该是sd(c(paste0("art",i,_1_2008", paste0("art",i,"_2_2008"))),我认为这不会像你一样工作打算。我建议查看应用函数(尤其是lapply()

标签: r loops variables names


【解决方案1】:

您不应该在全球环境中存在这样 100 多个向量。正如您所注意到的,管理它们或对它们执行任何计算变得非常困难。 R 提供了数据结构来管理这些对象,将它们放在列表或数据框中。

但是,考虑到手头的问题,您可以使用ls 搜索全局环境中的所有变量,您还可以指定模式以查找具有相似名称的对象等。因此我们创建变量art1art2 ....art250 使用paste0。我们找到所有具有特定模式的变量,并从中取出sd 并返回一个向量。

result <- sapply(paste0('art', 1:250, '_'), function(x) 
             sd(unlist(mget(ls(pattern = x, envir = .GlobalEnv),
                       .GlobalEnv)), na.rm = TRUE))

你可以试试这个例子:

art1_1_2008 <- 1
art1_2_2008 <- 5
art2_1_2008 <- 6
art2_2_2008 <- 8

result <- sapply(paste0('art', 1:2), function(x) 
              sd(unlist(mget(ls(pattern = x, envir = .GlobalEnv), 
                 .GlobalEnv)), na.rm = TRUE))
result
#    art1     art2 
#2.828427 1.414214 

#Confirm values are correct by checking manually. 
sd(c(1, 5))
#[1] 2.828427
sd(c(6, 8))
#[1] 1.414214

【讨论】:

  • 它工作到 art10,之后计算不再正确。我相信这是因为此功能与 art1 和 art10 问题。你知道如何调整你的功能来处理这个问题吗? Vg丹尼尔
  • @sdaniel24 是的,对不起。我错过了。您可以检查更新的答案吗?我在paste0 中添加了'_'
  • 嗨 Ronak 非常感谢你,这正是我所需要的 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多