为什么在使用R的ROSE包时我的数据框不能被识别为一个?

时间:2019-07-17 03:12:19

标签: r error-handling prediction

在建立二进制分类的预测模型时,我将数据分层为训练,验证和测试集。它们被放入数据帧列表中,并在需要时调用。结果是少数班,我想使用R的ROSE软件包下的各种功能来平衡我的训练集。

但是,我想在ROSE提供的不同平衡方法之间进行实验,而又不想在我的整个R脚本中重复执行相同的代码,因此,我做了一个Balance函数。 Balance带一个数据框和一个键,可在包的功能之间进行切换。

问题是:当我使用列表中的数据框作为输入来调用Balance时,我收到一条错误消息,指出as.data.frame.default无法将类“功能”强制为data.frame。我在下面提供了我的代码的简化版本。

如果有人可以看看,我将不胜感激。我对R和建模也很陌生,希望您能提出任何建议。

# make dataframe with variable and predictor columns; minority class: Predictor == 1
dataset <- as.data.frame(runif(100, min = 0, max = 100))
colnames(dataset) <- c("Var")
dataset$Predictor <- ifelse(dataset$Var < 20, 1, 0)

# stratify into train and test sets
prop <- c(train = .8, test = .2)
g <- sample(cut(
  seq(nrow(dataset)),
  nrow(dataset) * cumsum(c(0, prop)),
  labels = names(prop)))
ls <- split(dataset, g)

# balance using different functions in ROSE package
library(ROSE)
Balance <- function(df, key) {
  if (key == "under") {
    return(ovun.sample(
      Predictor ~.,
      data = df, 
      method = "under", 
      N = nrow(subset(df, Predictor == 1)) * 2)$data)
  } else if (key == "over") {
      return(ovun.sample(
        Predictor ~., 
        data = df, 
        method = "over", 
        N = nrow(subset(df, Predictor == 0)) * 2)$data)
  }
}

我确定Balance返回基于输入键的数据帧,并且调用class(ls $ train)也会给出data.frame。但是:

# this gives the below error
balancedTrain <- Balance(ls$train, "under")

# Error in as.data.frame.default(data, optional = TRUE) :
# cannot coerce class '"function"' to a data.frame

# yet when ls$train is assigned to df, the object name used in Balance, it works
df <- ls$train
balancedTrain <- Balance(df, "under")

我不确定发生了什么。有人可以帮忙吗?

0 个答案:

没有答案