Получить имена векторов внутри вектора для цикла for - PullRequest
0 голосов
/ 06 апреля 2019

Я применяю функцию k Nearest Neighbors (k-NN) к набору данных для различных значений k. Я хочу создать максимально динамичный документ, чтобы его можно было легко использовать для других данных и других значений k.

Я применяю функцию knn в цикле for для различных значений k и сохраняю результаты в переменных, названных в соответствии с k (я покажу код ниже).

Проблема возникает, когда я хочу повторить этот шаблон кода и использовать выходные данные функции knn для получения вероятностей, а также дать имя в соответствии с k, когда я запускаю цикл for.

Данные:

  • data_train и data_test - это фреймы данных со следующей структурой:

      v1 v2 v3 v4 v5
    1  1  0  1  0  1
    2  0  1  1  0  1
    3  1  1  1  1  1
    4  0  1  1  0  0
    5  1  0  1  0  1
    
  • train lab является фактором: "+" "+" "-" "-" "-"

Это код, который работает для применения функции knn():

# Using function knn() from class
# the values in ks must have been defined at the top of the document
ks = c(3, 5, 7)


test_pred_names = c()

for (k in ks){

     # Assigning different variable names according to kc
     test_pred<-paste("test_pred_", k, sep = "")

     # Including the argument prob=TRUE outputs the probabilities of     the predicted class together with the predicted class for each test case

     # Assigning the test_pred name to the output of knn
     print(assign(test_pred, knn(train=data_train, test=data_test,     cl=train_lab, k, prob = TRUE)))

     # Storing the names of the variables for each knn output
     test_pred_names = c(test_pred_names, test_pred)
}

# Storing the outputs of knn in a vector under the names defined in test_pred_names
test_preds <-mget(test_pred_names, envir = globalenv())

Затем я использую результаты в test_preds, чтобы получить вектор только с частью вывода из knn, вероятности:

test_prob_names = c()

# Extracting the probabilities for each of the outputs of knn
for (test_pred in test_preds){

      # assign different variable names according to k
      print(a = names(test_pred)) # this returns NULL

      # Assigning the test_prob name to the output of attr
      print(test_prob<-paste("prob_",a, sep = "")) # this returns "prob_"

      print(assign(test_prob, attr(test_pred, "prob")))
      test_prob_names = c(test_prob_names, test_prob)
}

Ожидаемый результат:

test_prob_names
> "prob_test_pred_3", "prob_test_pred_5", "prob_test_pred_7"

Фактический результат: Я получаю желаемый результат (вероятности), но не имена переменных.

test_pred_names
> "test_pred_3", "test_pred_5", "test_pred_7"

test_prob_names
> "prob_", "prob_", "prob_"

Если я просто запусту это вне цикла:

names(test_preds)
> "test_pred_3", "test_pred_5", "test_pred_7"  

(Другой комментарий: на самом деле я бы предпочел вырезать имена и использовать только число в "test_pred_5", чтобы имена переменных были похожи на "test_prob_5", но это был мой первый подход).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...