在R中的foreach循环中获取相应的变量名称

时间:2013-05-17 20:38:48

标签: r

如果我有4个不同的变量(V1, V2, V3, V4)并且我想轻易地迭代它们,我可以使用的一种方法是for(var in c(V1, V2, V3, V4))。有没有办法可以将函数应用于var,返回它代表的变量?例如,调用此函数f,代码

for(var in c(V1, V2, V3, V4))
  print(f(var))

应打印V1V2V3V4

这样的功能似乎不太可能存在,但我希望有人在这里作为一个明确的答案。

3 个答案:

答案 0 :(得分:2)

我想你可能会遇到这样的事情:

f <- function( ... ){
  args <- all.vars(match.call())
  x <- mget(args , envir = sys.frame())
  return( paste0( args , ": " , x ) )
}

V1 <- 1
V2 <- 2
V3 <- 3
f(V1 , V2 , V3)
# [1] "V1: 1" "V2: 2" "V3: 3"

这会从match.call中提取参数的名称作为字符向量,然后在mget中使用这些名称来查找函数环境中每个名称附加的值,并将结果粘贴在一起

但是,如果你有一个命名列表,你可以使用sapplyUSE.NAMES = TRUE循环遍历列表的元素并返回一个命名向量作为将一些函数应用于每个元素的结果。列表:

sapply( list( V1 = 1 , V2 = 2 , V3 = 3 , V4 = 4 ) , `^` , 2 )
#V1 V2 V3 V4 
# 1  4  9 16 

在上面的示例中,我们应用幂函数^并传递额外的参数2,即x^2,其中x是列表中的每个元素。

答案 1 :(得分:2)

我经常遇到这种情况。

我的策略是迭代变量 NAMES ,然后使用get

例如:

for(v in c("V1", "V2", "V3", "V4")){
   print(v)

  # then to operate on the variable
  var <- get(v)
}

额外的好处是你可以踢for循环并使用漂亮的lapply代替:

lapply(c("V1", "V2", "V3", "V4"),  print)


#- or -#

lapply(c("V1", "V2", "V3", "V4"), function(v) {
  print(v)
  someActionOn(get(v)))
})

答案 2 :(得分:0)

也许你想把你的vars分成某种结构,比如一个列表,然后循环遍历列表的元素

v1=rnorm(1030)
v2=rnorm(1330)
v3=rnorm(130)
varlist=list(Vee1=v1,Bee2=v2,vi3=v3)

for(i in 1:length(varlist)) {  
   assign( paste( names(varlist)[i],
                  "meanish",
                  sep=""), 
           mean(varlist[[i]]))
 }

然后查看ls()以查看您的内容。