【问题标题】:How do I call existing sequentially named variables to apply an operation in a for loop如何调用现有的顺序命名变量以在 for 循环中应用操作
【发布时间】:2012-04-24 13:32:09
【问题描述】:

我想使用 for 循环将某个操作应用于几个(按顺序命名的)变量,以缩短以下代码:

for(i in 1:ncol(data)) {assign(paste('var', i, sep = '.'), my.fun(data[,i]))}

result.1 <- new.fun(var.1)
result.2 <- new.fun(var.2)
result.3 <- new.fun(var.3)
...

那么,如何调用现有变量 var.1、var.2、....?我也试过在这里粘贴,但是没有用。

【问题讨论】:

标签: r


【解决方案1】:

简短回答:不要那样做;改为使用列表。

假设data 是一个data.frame:

vars <- lapply(data, my.fun)
results <- lapply(vars, new.fun)

【讨论】:

  • 这是一段很好的代码,已经解决了我的一些问题。但是,我也想使用列表来执行此操作,我无法将其组合到 data.frames。对不起,我的方法可能有点笨拙,但是有没有办法将列表名称插入到 for 循环中?
  • @user1353751:您不必将结果转换为 data.frame;这是我的假设,我已将其从答案中删除。正如 Ben Bolker 评论的那样,在字符串上使用 get。我仍然强烈建议你不要那样做。与仅使用列表相比,它不仅笨拙,而且更容易出错、难以调试、其他人难以理解。
【解决方案2】:

为了扩展@Jos​​hua 的回答,如果您的数据已经在变量中,例如 var.1、var.2、...,那么您可以使用以下代码将它们组合成一个列表:

mydata <- lapply( paste('var.', 1:10, sep=''), get )

mydata <- lapply( paste0('var.',1:10), get )

mydata <- lapply( sprintf('var.%d',1:10), get )

对于最后一个,如果您有 var001、var002、...等变量名称,则可以使用 "var%03d"

如果您希望列表中的术语命名(不需要,但可以很好),您可以这样做:

names(mydata) <- sprintf('var.%d', 1:10)

现在,如果您想访问列表中的单个元素,您可以使用 mydata[[3]]mydata$var.3 访问它。但是最大的好处是现在可以使用lapplysapplyvapply或其他工具对列表的每个元素运行相同的功能,如果要保存、复制、删除等数据你只需要担心一个对象,而不是需要另一个循环。

对于未来的项目,最好直接将数据读取或创建到列表中,而不是先创建单个变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2012-05-29
    相关资源
    最近更新 更多