在R中动态获取公式中的名称

时间:2016-05-11 22:27:29

标签: r

运行决策树时,我使用:

mod1 <- C5.0(Species ~ ., data = iris)

如果我想传入数据框并在公式中设置目标要素名称(不同于“物种”),我该怎么做?

例如,

mod1 <- C5.0(other_data[,target_column] ~ ., data = other_data)

这显然不起作用。

3 个答案:

答案 0 :(得分:3)

1)将公式粘贴在一起:

fun <- function(resp, data) C5.0(as.formula(paste(resp, "~ .")), data = data)

# test
library(C50)
fun("Species", iris)

,并提供:

Call:
C5.0.formula(formula = as.formula(paste(resp, "~ .")), data = data)

Classification Tree
Number of samples: 150 
Number of predictors: 4 

Tree size: 4 

Non-standard options: attempt to group attributes

2)或者这种变化可以在Call:输出后在线上更好地再现调用:

fun <- function(resp, data) 
  do.call(C5.0, list(as.formula(paste(resp, "~ .")), data = substitute(data)))
fun("Species", iris)

,并提供:

Call:
C5.0.formula(formula = Species ~ ., data = iris)

Classification Tree
Number of samples: 150 
Number of predictors: 4 

Tree size: 4 

以下是使用内置数据框fun对此CO2版本进行的第二次测试:

fun("Plant", CO2)

,并提供:

Call:
C5.0.formula(formula = Plant ~ ., data = CO2)

Classification Tree
Number of samples: 84 
Number of predictors: 4 

Tree size: 7 

Non-standard options: attempt to group attributes

答案 1 :(得分:0)

可能更可取的替代方法是在创建公式后覆盖解析树中的符号:

x <- Species~.;
x;
## Species ~ .
x[[2L]] <- as.symbol('Blah');
x;
## Blah ~ .

以上是有效的,因为公式被编码为普通的解析树,顶级节点由'language'函数的调用('call',模式`~`())组成,并归类为'formula'

(function(x) c(typeof(x),mode(x),class(x)))(.~.);
## [1] "language" "call"     "formula"

所有解析树都可以作为递归列表结构进行读写。在这里,我将演示使用我最初为this answer编写的一个很好的小递归函数:

unwrap <- function(x) if (typeof(x) == 'language') lapply(as.list(x),unwrap) else x;
unwrap(Species~.);
## [[1]]
## `~`
##
## [[2]]
## Species
##
## [[3]]
## .
##

换句话说,解析树表示函数调用,函数符号作为第一个列表组件,然后所有函数参数作为后续列表组件。普通公式的特殊情况将LHS捕获为第一个函数参数,将RHS捕获为第二个。因此x[[2L]]代表公式的LHS符号,我们可以直接用您首选符号的正常分配覆盖。

答案 2 :(得分:0)

以下内容允许将任意数据和目标特征传递给C50方法:

boosted_trees <- function(data_train, target_feature, iter_choice) {

    target_index <- grep(target_feature, colnames(data_train))
    model_boosted <- C5.0(x = data_train[, -target_index], y = data_train[[target_feature]], trial=iter_choice)
    model_boosted$call$x <- data_train[, -target_index]
    model_boosted$call$y <- data_train[[target_feature]]
    return(model_boosted)

}

诀窍是在构建模型后重命名方法调用中的术语,以便可以绘制它。