【问题标题】:Mysterious error while passing column name to a function in R将列名传递给R中的函数时出现神秘错误
【发布时间】:2017-05-14 21:29:30
【问题描述】:

我正在创建一个函数,它通过数据框压缩并将factor 变量传播到新的虚拟变量,因为某些机器学习算法无法处理因子。为此,我在清理函数中使用了spread() 函数。

但是,当我尝试传递需要传播的列的名称时,它会引发错误:

Error: Invalid column specification

代码如下:

library(tidyr)
library(dplyr)    
library(C50) # this is one source for the churn data
data(churn)


f <- function(df, name)  {
  df$dummy <- c(1:nrow(df))       # create dummy variable with unique values

  df <- spread(df, key <- as.character(substitute(name)), "dummy", fill = 0 )
}

churnTrain = f(churnTrain, name = "state")
str(churnTrain)

当然,如果我用key = "state" 替换key = as.character(substitute(name)),它工作得很好,但是整个函数失去了它的可重用性。

如何将列名传递给内部函数而不出错?

【问题讨论】:

  • 问题是您使用的是&lt;- 而不是=。它们都以相同的方式分配给变量,但在这里您尝试将某些内容传递给 需要 = 运算符的参数。通过使用&lt;-,您将as.character(... 保存到名为key 的对象中,而不是将其传递给spreadkey 参数
  • 另外,在您提供的代码中,不需要substitutespread 需要 character 类型的对象作为其 key 参数,因此您可以直接传入名称参数:spread(df, key = name, ...)

标签: r dplyr tidyr spread


【解决方案1】:

你需要使用tidyverse吗?

如果没有,你可以试试旧的reshape2 包:

library(reshape2) library(C50) # this is one source for the churn data data(churn) f <- function(df1, name) { df1$dummy <- 1:nrow(df1) # create dummy variable with unique values df1 <- dcast(df1, as.formula(paste0("dummy~", name))) } ct1 <- f(churnTrain, name = "state")

如果您绝对需要在tidyverse 工作,您可以尝试按照http://dplyr.tidyverse.org/articles/programming.html 的教程进行操作。不幸的是,他们的示例无法在我的机器上运行。

【讨论】:

    【解决方案2】:
    library(tidyr)
    library(dplyr)    
    library(C50) # this is one source for the churn data
    data(churn)
    
    
    f <- function(df, name)  {
      df$dummy <- c(1:nrow(df))       # create dummy variable with unique values
    
      df <- spread_(df, key = name, "dummy", fill = 0 )
    }
    
    churnTrain = f(churnTrain, name = "state")
    str(churnTrain)
    

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多