【问题标题】:Dynamically change column names based on inputs根据输入动态更改列名
【发布时间】:2013-04-20 18:00:53
【问题描述】:

我正在尝试根据输入动态命名数据框的输出。

get.max2 <- function(data = NULL, column)
{
  #require(qdap)
  col <- eval(substitute(column), data)
  max <- max(eval(substitute(column), data))
  name <- lookup(col, max, rownames(data))
  name <- name[!is.na(name)]
  #title <- do.call('paste', list(paste(match.call()[1])))
  df <- data.frame(name = name, title = max(col))
  print(df)
}

目前,输出如下所示:

get.max2(mtcars, mpg)

      name title
Volvo 142E  33.9

但是,我希望它看起来像这样:

get.max2(mtcars, mpg)

      name  mpg
Volvo 142E 33.9

我认为答案与 match.call/do.call 有关,但在使用这些函数时,我的知识充其量是模糊的。有谁知道这可能吗?

感谢您的帮助!

【问题讨论】:

    标签: r function dataframe do.call qdap


    【解决方案1】:

    你是title=.. 声明几乎没有。

    你想改用:

     title = paste(match.call()[-(1:2)], collapse=" ")   
     # the collapse argument is optional, it's not clear
     #    how you would like to handle multiple arguments
    

    请注意与您所拥有的两个主要区别:

    1. 使用[-(1:2)] 而不是[1]match.call() 中的元素是您不想要的函数名称。或者,如果您只需要第二个参数,您可以使用match.call()[3]
    2. 在这种情况下,不需要do.call(.)paste 工作得很好。

    【讨论】:

      【解决方案2】:

      您正在寻找类似?deparse?substitute 的内容。

      variableName <- function(x) {
        return(deparse(substitute(x)))
      }
      
      variableName(title)
      # [1] "title"
      
      variableName(mpg)
      # [1] "mpg"
      

      【讨论】:

        【解决方案3】:

        感谢大家的帮助!我发现的另一个解决方法是在处理后重命名数据框。

        get.max2 <- function(data = NULL, column)
        {
          #require(qdap)
          #require(gdata)
          col <- eval(substitute(column), data)
          max <- max(eval(substitute(column), data))
          name <- lookup(col, max, rownames(data))
          name <- name[!is.na(name)]
          df <- data.frame(name = name, title = max(col))
          title2 <- do.call('paste', list(paste(match.call()[3])))
          df <- rename.vars(df, 'title', title2, info = F)
          return(df)
        }
        

        返回:

        get.max2(mtcars, mpg)
        
              name  mpg
        Volvo 142E 33.9
        

        【讨论】:

          猜你喜欢
          • 2013-02-22
          • 2013-01-31
          • 2021-12-02
          • 1970-01-01
          • 2016-11-07
          • 2020-07-07
          • 1970-01-01
          相关资源
          最近更新 更多