循环浏览R中的字符串变量名称

问题描述

我必须从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","_1_2008","art","_2_2008")))
   }

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

解决方法

在全球环境中,您不应有大约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,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