【问题标题】:Loop within a function and automatically create objects in R在函数内循环并在 R 中自动创建对象
【发布时间】:2012-12-30 14:13:05
【问题描述】:

我尝试计算 R 中不同组的列均值。存在多种分配组的方法,因此创建的两列包含不同的分组。

    # create a test df
    df.abcd.2<-data.frame(Grouping1=c("a","f","a","d","d","f","a"),Grouping2=c("y","y","z","z","x","x","q"),Var1=sample(1:7),Var2=sample(1:7),Var3=rnorm(1:7))
    df.abcd.2

现在我创建了一个包含 assign、lapply、split 和 colMeans 的循环来获取我的结果并将其存储在不同的 dfs 中。循环工作正常。

   #Loop to create the colmeans and store them in dataframes
    for (i in 1:2){
      nam <- paste("RRRRRR",deparse(i), sep=".")
      assign(nam, as.data.frame(
        lapply(
          split(df.abcd.2[,3:5], df.abcd.2[,i]), colMeans)
      )
      )
    }

所以现在我想创建一个函数来将此方法应用于不同的数据帧。我的尝试看起来像这样:

    # 1. function to calculate colMeans for diffrent groups
    # df= desired datatframe, 
    # a=starting column: beginning of the columns that contain the groups, b= end of columns that contain the groups
    # c=startinc column: beginning of columns to be analized, d=end of columns do be analized

    function.split.colMeans<-function(df,a,b,c,d)
    {for (i in a:b){
      nam <- paste("OOOOO",deparse(i), sep=".")
      assign(nam, as.data.frame(
        lapply(
          split(df[,c:d], df[,i]), colMeans)
      )
      )
    }
    }
    #test the function
    function.split.colMeans(df.abcd.2,1,2,3,5)

因此,当我测试此功能时,我既没有收到错误消息也没有收到结果...谁能帮帮我吗?

【问题讨论】:

  • 您确定您真的想将结果存储在不同的对象中吗?我在这里的两分钱就是在列表中做所有事情。
  • @RomanLuštrik 。我理解你的意思吗,你会写一个循环来将所有结果存储在一个列表中?我试着听从你的建议,并使用了 plyr 包中的 dlply 。所以我的函数看起来像function.list&lt;-function(x,a,b){for (i in a:b){dlply(x,.(x[,i]),colwise(mean))}}。但不幸的是,它不适用于循环。能否提供更多信息?

标签: r function object loops


【解决方案1】:

它运行良好。阅读分配的帮助。了解框架和环境。

换句话说,它在你的函数中创建变量,但它们不会泄漏到你在命令行中执行ls() 时看到的环境中。如果你将print(ls()) 放在你的函数循环中,你会看到它们,但是当函数结束时,它们会消失。

通常,函数与其调用环境交互的唯一方式是通过返回值。任何其他方法都在进入一个痛苦的世界。

不要使用 assign 来创建具有顺序或信息名称的事物。曾经。除非您知道自己在做什么,但您不知道...将它们放在列表中,然后您可以索引这些部分以进行循环等等。

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2016-07-11
    • 2014-12-08
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多