Как хранить значения из цикла в dataframe в R? - PullRequest
0 голосов
/ 16 января 2019

Я новичок в R и программировании, я хочу сохранить значения от цикла до фрейма данных в R. Я хочу, чтобы значения ker, cValues, accuracyValues были сохранены во фрейме данных из приведенного ниже кода. Я не могу этого добиться, фрейм данных сохраняет только последнее значение, а не все значения.

Можете ли вы помочь мне с этим, пожалуйста.

# Define a vector which has different kernel methods
kerna <- c("rbfdot","polydot","vanilladot","tanhdot","laplacedot",
           "besseldot","anovadot","splinedot")

# Define a for loop to calculate accuracy for different values of C and kernel
for (ker in kerna){
    cValues <- c()
    accuracyValues <- c()
    for (c in 1:100) {
        model <- ksvm(V11~V1+V2+V3+V4+V5+V6+V7+V8+V9+V10,
                      data = credit_card_data,
                      type ="C-svc",
                      kernel = ker,
                      C=c,
                      scaled =TRUE)
        pred <- predict(model,credit_card_data[,1:10])
        #pred
        accuracy <- sum(pred== credit_card_data$V11)/nrow(credit_card_data)

        cValues[c] <- c;
        accuracyValues[c] <- accuracy;

    }

    for(i in 1:100) {
        print(paste("kernal:",ker, "c=",cValues[i],"accuracy=",accuracyValues[i]))


    }

}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Рассмотрим Map для построения списка фреймов данных из каждой пары из ker и cValues ​​ (1:100), сгенерированных из expand.grid, и строки связывают все элементы вместе.

k_c_pairs_df <- expand.grid(kerna=kerna, c_value=1:100, stringsAsFactors = FALSE)

model_fct <- function(ker, c) {
      model <- ksvm(V11~V1+V2+V3+V4+V5+V6+V7+V8+V9+V10,
                    data = credit_card_data,
                    type ="C-svc",
                    kernel = ker,
                    C=c,
                    scaled =TRUE)

      pred <- predict(model,credit_card_data[,1:10])
      accuracy <- sum(pred== credit_card_data$V11)/nrow(credit_card_data)

      print(paste("kernal:",ker, "c=",cValues[i],"accuracy=",accuracyValues[i]))

      return(data.frame(kernel = ker, cValues = c, accuracyValues = accuracy))
}

df_list <- Map(model_fct, k_c_pairs_df$ker, k_c_pairs_df$c_value)

final_df <- do.call(rbind, df_list)
0 голосов
/ 16 января 2019

Начиная с базового кода, настройте структуру кадра выходных данных. Затем выполните цикл и введите значения точности на каждой итерации. Этот метод также «выравнивает» вложенный цикл и избавляет от переменной c, которая конфликтует со встроенной функцией c().

kerna <- c("rbfdot","polydot","vanilladot","tanhdot","laplacedot",
           "besseldot","anovadot","splinedot")

# Create dataframe to store output data
df <- data.frame(kerna = rep(kerna, each = 100), 
                 cValues = rep(1:100, times = length(kerna)),
                 accuracyValues = NA,
                 stringsAsFactors = F)

# Define a for loop to calculate accuracy for different values of C and kernel
for (i in 1:nrow(df)){
  ker <- df$kerna[i]
  j <- df$cValues[i]
  model <- ksvm(V11~V1+V2+V3+V4+V5+V6+V7+V8+V9+V10,
                data = credit_card_data,
                type ="C-svc",
                kernel = ker,
                C=j,
                scaled =TRUE)
  pred <- predict(model,credit_card_data[,1:10])
  accuracy <- sum(pred== credit_card_data$V11)/nrow(credit_card_data)

  # Insert accuracy into df$accuracyValues
  df$accuracyValues[i] <- accuracy;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...