【发布时间】: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)),它工作得很好,但是整个函数失去了它的可重用性。
如何将列名传递给内部函数而不出错?
【问题讨论】:
-
问题是您使用的是
<-而不是=。它们都以相同的方式分配给变量,但在这里您尝试将某些内容传递给 需要=运算符的参数。通过使用<-,您将as.character(...保存到名为key的对象中,而不是将其传递给spread的key参数 -
另外,在您提供的代码中,不需要
substitute。spread需要character类型的对象作为其key参数,因此您可以直接传入名称参数:spread(df, key = name, ...)