【问题标题】:R - How to add columns to a dataset incrementally using a loop?R - 如何使用循环递增地向数据集添加列?
【发布时间】:2016-05-03 00:35:57
【问题描述】:

我试图通过递增地添加每个变量来获得朴素贝叶斯分类器的错误率。例如,我的数据集中有 25 个变量。当我一次添加一个变量时,我想获得模型的错误率。所以你知道它会输出模型的前 2 列的错误率,前 3 列的错误率,然后是前 4 列的错误率,依此类推,直到最后一列。

这是我想要实现的伪代码

START
IMPORT DATASET WITH ALL VARIABLES

num_variables = num_dataset_cols
i= 1

WHILE (i <= num_variables)
{
   CREATE NEW DATASET WITH x COLUMNs

   BUILD THE MODEL 
   GET THE ERROR RATE

   ADD IN NEXT COLUMN

   i = i + 1
}

这是一个可重复的问题。显然你不能用这些数据构建一个 NB 分类器,但这不是我的问题。我的问题是一一添加。到目前为止,我能做到的唯一方法是覆盖每一列。对于 NB 分类器,第一列是类节点,因此必须至少有 2 列开始才能运行。

#REPRODUCIBLE EXAMPLE
col1 <- c("A", "B", "C", "D", "E")
col2 <- c(1,2,3,4,5)
col3 <- c(TRUE, FALSE, FALSE, TRUE, FALSE)
col4 <- c("n","y","y","n","y")
col5 <- c("10", "15", "50", "100", "20")

dataset <- data.frame(col1, col2, col3, col4,col5)

num_variables <- ncol(dataset)

i <- 1

while i <= num_variables 
{
data <- dataset[c(1, i+1)]
str(data)

#BUILD MODEL AND GET VALIDATION ERROR

#INCREMENT i TO GET NEXT COLUMN
i <- i + 1

}

您应该能够从str(data) 看到每次该列被覆盖。有谁知道我如何在不覆盖前一列的情况下添加每一列?有人向我建议了一个数组,但我对 R 中的数组不太熟悉。这可行吗?

【问题讨论】:

    标签: r loops dataframe naivebayes


    【解决方案1】:

    在 while 循环中使用“assign”函数有助于解决此类问题。您没有显示模型语法,但这样的东西应该可以工作:

    dataset$errorrate <- [whatever makes this calculation, assuming it is vectorized]
    name <- paste0(errorrate, i)
    assign(name, dataset$errorrate)
    

    ...

    这应该会给您留下 i 个变量,其中包含每个模型运行的误差估计值。如果您正在为每个模型寻找一个参数估计值,您可以使用上述过程在全局环境中为单个估计值分配一个唯一名称,然后在循环完成后将它们 rbind 在一起

    【讨论】:

    • 感谢您的帮助!我不认为这对我有用,因为我用来获取 cv 错误率的包没有给我一个可以分配给向量的值。但是它应该对我的逻辑回归模型很有效!
    【解决方案2】:

    我想这就是你想要的。

    col1 <- c("A", "B", "C", "D", "E")
    col2 <- c(1,2,3,4,5)
    col3 <- c(TRUE, FALSE, FALSE, TRUE, FALSE)
    col4 <- c("n","y","y","n","y")
    col5 <- c("10", "15", "50", "100", "20")
    
    dataset <- data.frame(col1, col2, col3, col4,col5)
    dataset
    
    num_variables <- ncol(dataset)
    num_variables
    i <- 1
    
    while (i <= num_variables) {
    
    data <- dataset[, 1:i]
    
    print(str(data))
    
    #BUILD MODEL AND GET VALIDATION ERROR
    
    #INCREMENT i TO GET NEXT COLUMN
    i <- i + 1
    
    }
    
    Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
    NULL
    'data.frame':   5 obs. of  2 variables:
     $ col1: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
     $ col2: num  1 2 3 4 5
    NULL
    'data.frame':   5 obs. of  3 variables:
     $ col1: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
     $ col2: num  1 2 3 4 5
     $ col3: logi  TRUE FALSE FALSE TRUE FALSE
    NULL
    'data.frame':   5 obs. of  4 variables:
     $ col1: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
     $ col2: num  1 2 3 4 5
     $ col3: logi  TRUE FALSE FALSE TRUE FALSE
     $ col4: Factor w/ 2 levels "n","y": 1 2 2 1 2
    NULL
    'data.frame':   5 obs. of  5 variables:
     $ col1: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
     $ col2: num  1 2 3 4 5
     $ col3: logi  TRUE FALSE FALSE TRUE FALSE
     $ col4: Factor w/ 2 levels "n","y": 1 2 2 1 2
     $ col5: Factor w/ 5 levels "10","100","15",..: 1 3 5 2 4
    NULL
    

    【讨论】:

    • 谢谢!这很好用!您所做的唯一重大更改似乎是将 : 添加到 data &lt;- dataset[, 1:i] 行。这会逐行递增吗?
    • 不客气。是的,这是主要的变化。也不要忘记while语句中的括号()。
    【解决方案3】:

    定义output变量后可以使用append函数

    data <- dataset[c(1, i+1)]
    append(output, data)
    str(data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 2021-10-11
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多