R语言:将循环结果存储到表中

R语言:将循环结果存储到表中,r,loops,matrix,data-manipulation,decision-tree,R,Loops,Matrix,Data Manipulation,Decision Tree,我正在使用R编程语言。我正在学习如何循环过程并将结果存储到表中。对于本例,我首先生成了一些数据: #load libraries library(caret) library(rpart) #generate data a = rnorm(1000, 10, 10) b = rnorm(1000, 10, 5) c = rnorm(1000, 5, 10) group <- sample( LETTERS[1:2], 1000, r

我正在使用R编程语言。我正在学习如何循环过程并将结果存储到表中。对于本例,我首先生成了一些数据:

#load libraries    
library(caret)
library(rpart)
        
#generate data
            
a = rnorm(1000, 10, 10)

b = rnorm(1000, 10, 5)

c = rnorm(1000, 5, 10)

group <- sample( LETTERS[1:2], 1000, replace=TRUE, prob=c(0.5,0.5) )
group_1 <- 1:1000

#put data into a frame
d = data.frame(a,b,c, group, group_1)

d$group = as.factor(d$group)

下面是我要循环的过程。基本上,我想在这些数据上拟合一个决策树模型。我想拟合6个不同的决策树:如果“group_1>I”,变量“group_1”(响应变量)将变为因子变量(“1”或“0”)。“i”变量采用6个值(400401402403404405)。因此,决策树拟合6次。我想将每个决策树的准确性存储到“最终_表”中:

有人能告诉我我做错了什么吗


谢谢

您可以在任何其他变量中创建原始数据帧的副本,用于在每次迭代中覆盖更改的数据帧

library(caret)
library(rpart)

e <- d

for (i in 400:405) {
  d <- e
  d$group_1 = as.integer(d$group_1 > i)
  d$group_1 = as.factor(d$group_1)
  
  trainIndex <- createDataPartition(d$group_1, p = .8,list = FALSE,times = 1)
  training = d[ trainIndex,]
  test  <- d[-trainIndex,]
  
  
  fitControl <- trainControl(## 10-fold CV
    method = "repeatedcv",
    number = 10,
    ## repeated ten times
    repeats = 10)
  
  TreeFit <- train(group_1 ~ ., data = training,
                   method = "rpart2",
                   trControl = fitControl)
  
  pred = predict(TreeFit, test, type = "prob")
  labels = as.factor(ifelse(pred[,2]>0.5, "1", "0"))
  con = confusionMatrix(labels, test$group_1)
  
  #update results into table
  row = i - 399
  final_table[row,1] = con$overall[1]
  final_table[row,2] = i
  
}

final_table
#      [,1] [,2]
#[1,] 0.585  400
#[2,] 0.618  401
#[3,] 0.598  402
#[4,] 0.608  403
#[5,] 0.533  404
#[6,] 0.570  405
库(插入符号)
图书馆(rpart)

e循环的前两行将
group_1
转换为
1
0
的系数,根据其值与
i
进行比较-第一个循环可以,但在第二个循环中,变量的原始
1:1000
已替换为
1
0
的系数,从而导致您的错误明白了。谢谢你的回答!我可以用(样本(100:400,10)中的i)代替(400:405中的i)吗?我得到了以下错误:na.fail.default(列表)中的错误(group_1=c(na_integer,na_integer,na_integer,na_integer,,:对象中缺少值。感谢您的帮助是的,但是此行将失败
row=I-399
for (i in 400:405) 
{
  d$group_1 = ifelse(d$group_1 > i, "1","0")
  d$group_1 = as.factor(d$group_1)
  
  
  trainIndex <- createDataPartition(d$group_1, p = .8,
                                    list = FALSE,
                                    times = 1)
  training = d[ trainIndex,]
  test  <- d[-trainIndex,]
  
  
  fitControl <- trainControl(## 10-fold CV
    method = "repeatedcv",
    number = 10,
    ## repeated ten times
    repeats = 10)
  
  TreeFit <- train(group_1 ~ ., data = training,
                   method = "rpart2",
                   trControl = fitControl)
  
  pred = predict(TreeFit, test, type = "prob")
  labels = as.factor(ifelse(pred[,2]>0.5, "1", "0"))
  con = confusionMatrix(labels, test$group_1)
  
  #update results into table
  row = i - 399
  final_table[row,1] = con$overall[1]
  final_table[row,2] = i
}
Error in na.fail.default(list(group = c(2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L,  : 
      missing values in object
    In addition: Warning message:
    In Ops.factor(d$group_1, i) : ‘>’ not meaningful for factors
library(caret)
library(rpart)

e <- d

for (i in 400:405) {
  d <- e
  d$group_1 = as.integer(d$group_1 > i)
  d$group_1 = as.factor(d$group_1)
  
  trainIndex <- createDataPartition(d$group_1, p = .8,list = FALSE,times = 1)
  training = d[ trainIndex,]
  test  <- d[-trainIndex,]
  
  
  fitControl <- trainControl(## 10-fold CV
    method = "repeatedcv",
    number = 10,
    ## repeated ten times
    repeats = 10)
  
  TreeFit <- train(group_1 ~ ., data = training,
                   method = "rpart2",
                   trControl = fitControl)
  
  pred = predict(TreeFit, test, type = "prob")
  labels = as.factor(ifelse(pred[,2]>0.5, "1", "0"))
  con = confusionMatrix(labels, test$group_1)
  
  #update results into table
  row = i - 399
  final_table[row,1] = con$overall[1]
  final_table[row,2] = i
  
}

final_table
#      [,1] [,2]
#[1,] 0.585  400
#[2,] 0.618  401
#[3,] 0.598  402
#[4,] 0.608  403
#[5,] 0.533  404
#[6,] 0.570  405