2015-01-22 3 views
0

У меня есть этот код, который предназначен для создания кадра данных, который будет содержать матрицу производительности нескольких моделей классификации:R обновления кадров данных весь столбец

eval_table <- data.frame(norm_method_1=c("","","","",""),norm_method_2=c("","","","",""),norm_method_3=c("","","","",""),norm_method_4=c("","","","",""),norm_method_5=c("","","","",""),norm_method_6=c("","","","",""),norm_method_7=c("","","","",""),norm_method_8=c("","","","","")) 
    rownames(eval_table) <- c("Log. Model Coeff","Log. Model Confusion Matrix","Log. Model AUC","Linear Modl Coeff","Linear Model overfit ratio") 

    col <- list(mnm_coef,cm,auc,lm_summary$coefficients,lm_summary$training_testing_error_ratio) 
    eval_table[,c("norm_method_1")] <- col 

При попытке обновить первый столбец данных кадр (последняя строка) со списком 5 элемент, который я подготовил заранее (кадр данных есть 5 строк), я получаю следующее сообщение об ошибке:

Error in `[<-.data.frame`(`*tmp*`, , c("norm_method_1"), value = list(: 
    replacement element 1 is a matrix/data frame of 2 rows, need 5 

Любая идея, почему?

UPDATE:

dim(col) 
NULL 
str(col) 
> str(col) 
List of 5 
$ : num [1:2, 1:30] 21.436 40.828 -0.785 0.54 -1.375 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:2] "2" "3" 
    .. ..$ : chr [1:30] "(Intercept)" "is_top_rated_listing1" "seller_is_top_rated_seller" "is_auto_pay1" ... 
$ :List of 5 
    ..$ positive: NULL 
    ..$ table : 'table' int [1:3, 1:3] 414 73 433 101 329 1186 147 60 10546 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ Prediction: chr [1:3] "1" "2" "3" 
    .. .. ..$ Reference : chr [1:3] "1" "2" "3" 
    ..$ overall : Named num [1:7] 0.849 0.402 0.843 0.856 0.809 ... 
    .. ..- attr(*, "names")= chr [1:7] "Accuracy" "Kappa" "AccuracyLower" "AccuracyUpper" ... 
    ..$ byClass : num [1:3, 1:8] 0.45 0.204 0.981 0.98 0.989 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:3] "Class: 1" "Class: 2" "Class: 3" 
    .. .. ..$ : chr [1:8] "Sensitivity" "Specificity" "Pos Pred Value" "Neg Pred Value" ... 
    ..$ dots : list() 
    ..- attr(*, "class")= chr "confusionMatrix" 
$ :Classes 'auc', 'numeric' atomic [1:1] 0.592 
    .. ..- attr(*, "partial.auc")= logi FALSE 
    .. ..- attr(*, "percent")= logi FALSE 
    .. ..- attr(*, "roc")=List of 8 
    .. .. ..$ percent  : logi FALSE 
    .. .. ..$ sensitivities: num [1:1021] 1 0.998 0.998 0.998 0.996 ... 
    .. .. ..$ specificities: num [1:1021] 0 0 0.00151 0.00302 0.00302 ... 
    .. .. ..$ thresholds : num [1:1021] -Inf 0.358 0.359 0.36 0.361 ... 
    .. .. ..$ direction : chr "<" 
    .. .. ..$ cases  : num [1:462] 0.51 0.727 0.725 0.667 0.667 ... 
    .. .. ..$ controls  : num [1:662] 0.903 0.967 0.756 0.966 0.981 ... 
    .. .. ..$ fun.sesp  :function (thresholds, controls, cases, direction) 
    .. .. ..- attr(*, "class")= chr "roc" 
$ : num [1:28, 1:4] 3.18 3.49 -3.55 -1.16 4.1 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:28] "(Intercept)" "is_top_rated_listing1" "seller_is_top_rated_seller" "is_auto_pay1" ... 
    .. ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)" 
$ : num 0.819 
> 
+5

ошибка говорит почему. – Roland

+0

Буду признателен, если бы вы могли уточнить: в моем списке есть 5 элементов, и у моей базы данных 5 строк. Как я могу обновить первый столбец с помощью списка 5 элементов, чтобы каждый элемент списка был записан в другую строку. – user3628777

+0

Ну, ошибка IMHO говорит, что 'mnm_coef' - это матрица (или фрейм данных) с двумя строками. Так что вы пытаетесь не подходит вообще. Однако никто не может сказать точно, так как вы не представили воспроизводимый пример (готовый копировать/вставлять и запускать без ошибок, кроме ваших). – lukeA

ответ

0

Если вы в такой ситуации, вам нужно проверить, что размер ваших данных, что вы думаете. Использовать

length(col) 

для проверки ваших предположений о col. В сообщении говорится, что размеры несовместимы.

Если бы они были, то задание будет работать - например,

col <- c(1,2,3,4,5) 
eval_table[,c("norm_method_1")] <- col 

В этом случае length(col) возвращается 5.

Еще одна полезная команда str - т.е. str(eval_table) и str(col). Это поможет вам увидеть размерность несовместимости.

В этом случае ваш первый элемент является матрицей. Поэтому мы могли бы издеваться над этим так:

mat <- matrix(1,2) 
col <- list(mat, 2, 3, 4, 5) 

Тогда вы увидите сообщение об ошибке, которую вы получили. Чтобы преодолеть это, построить свой список с первым элементом матрицы в качестве первого элемента, и построить его в качестве вектора:

col <- c(mat[1][1], 2,3, 4,5) 

Тогда это работает:

eval_table[,c("norm_method_1")] <- col 
+0

Длина 5 и все еще не работает (такая же ошибка). С другой стороны: eval_table $ norm_method_1 <- col действительно работает. Любая идея, как я могу получить доступ к кадру данных с помощью первого (и в настоящее время ошибочного) подхода, поскольку имя столбца изменяется – user3628777

+0

Что показывает 'str (col)'? Можете ли вы использовать 'dim (col)'? –

+0

см. UPDATE выше в Q – user3628777