【问题标题】:Writing a function with an input that is a column of a dataframe called in the function编写一个函数,其输入是函数中调用的数据框的一列
【发布时间】:2019-09-10 03:35:54
【问题描述】:

我正在尝试编写一个函数,它具有作为输入参数的一列数据帧,这些数据帧在函数中被迭代调用。

示例如下: 编写一个名为 iter 的函数,它有 2 个输入: 1)数据框列表 2) df1 和 df2 包含的列的名称

iter <- function (dflist, columnname) {
  for (df in dflist){
      df[,bla:=cut(columnname, etc)]
      lm(...data=df)
      etc
  }
}

例如: dflist = list(df1,df2) 并且 df1 和 df2 都包含一个名为 col1 的列

我想写一个函数,当我输入 iter(dflist,col1)

我收到df[,bla:=cut(col1, etc)]

但是,每当我现在运行它时,都会出现此错误 - "object 'col1' not found.

我尝试将 col1 作为列表传入并使用 get(columnname),但无济于事:

iter <- function (dflist, columnname) {
  for (df in dflist){
      df[,bla:=cut(get(columnname), etc)]
      lm(...data=df)
      etc
  }
}

iter(dflist,'col1')

但我得到同样的错误

【问题讨论】:

    标签: r function rstudio lm


    【解决方案1】:

    您真的需要不带引号的列吗?我发现动态更改具有columname 参数的列作为单个character 字符串对象要容易得多。您可以使用as.symbol() – 或as.name()– 创建一个对象(函数中的sym),稍后您可以将所述对象称为R 对象——而不是它的值,无论分配给@987654327 @。

    然后,您可以在常规 data.table 语法中使用 eval() 在其环境中评估 sym 对象。

    library(data.table)
    
    dList <- list(
      mtcars,
      mtcars
    )
    
    dList <- lapply(dList, function(x) copy(as.data.table(x)))
    
    iter <- function (dflist, columnname) {
      new_var <- paste0(columnname, "_sq") 
      sym <- as.symbol(columnname)
      for (df in dflist){
        df[,(new_var):= eval(sym)^2]
      }
    }
    
    iter(dList, "mpg")
    

    结果...

    > head(dList[[2]], 1)
       mpg cyl disp  hp drat   wt  qsec vs am gear carb mpg_sq
    1:  21   6  160 110  3.9 2.62 16.46  0  1    4    4    441
    

    请记住,iter 将改变 dList 中的对象,即使您没有在函数中指定 return。赋值运算符:= 通过引用分配任何内容。请参阅此Q 以获得更彻底的解释。如果你想改变函数内部“但在外部”的对象并返回一个包含结果对象的列表,你需要首先使用data.table::copy

    iter <- function (dflist, columnname) {
      new_var <- paste0(columnname, "_sq")
      res <- vector("list", length(dflist))
      sym <- as.symbol(columnname)
      for (i in seq_along(res)){
        dt <- copy(dflist[[i]])
        res[[i]] <- dt[,(new_var):= eval(sym)^2]
      }
      return(res)
    }
    

    【讨论】:

    • 感谢您的详细回答,是的,因为.symbol 就是我要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多