Вывести текущую строку data.frame, также известный как purrr ::: pmap - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь понять , и сейчас я работаю с . pmap может использоваться для вызова предопределенной функции и использует значения в в качестве аргументов для вызова функции. Я хотел бы знать, каково текущее состояние, так как мои data.frames могут иметь несколько тысяч строк.

Как мне распечатать текущую строку, на которой работает pmap, возможно вместе с итогом длина data.frame?

Я попытался включить счетчик как в для l oop, а также попытался захватить текущую строку, используя

current <- data.frame(...)

а затем row.names(current)

(идея отсюда: https://blog.az.sg/posts/map-and-walk/)

, но в обоих случаях всегда печатается 1.

Спасибо за помощь.

Для воспроизводимости давайте используем код из вопроса, который привел меня к purrr:::pmap ( Как использовать значения expand.grid для запуска различных комбинаций гиперпараметров модели для рейнджер в R ):

library(ranger)
data(iris)
Input_list <- list(iris1 = iris, iris2 = iris)  # let's assume these are different input tables

# the data.frame with the values for the function
hyper_grid <- expand.grid(
  Input_table = names(Input_list),
  Trees = c(10, 20),
  Importance = c("none", "impurity"),
  Classification = TRUE,
  Repeats = 1:5,
  Target = "Species")

# the function to be called for each row of the `hyper_grid`df
fit_and_extract_metrics <- function(Target, Input_table, Trees, Importance, Classification, ...) {
  RF_train <- ranger(
    dependent.variable.name = Target, 
    data = Input_list[[Input_table]],  # referring to the named object in the list
    num.trees = Trees, 
    importance = Importance, 
    classification = Classification)  # otherwise regression is performed

  data.frame(Prediction_error = RF_train$prediction.error,
             True_positive = RF_train$confusion.matrix[1])
}

# the pmap call using a row of hyper_grid and the function in parallel
hyper_grid$res <- purrr::pmap(hyper_grid, fit_and_extract_metrics)

Я попробовал две вещи:

counter <- 0
fit_and_extract_metrics <- function(Target, Input_table, Trees, Importance, Classification, ...) {
  counter <- counter + 1
  print(paste(counter, "of", nrow(hyper_grid)))
  # rest of the function
}

# and also 
fit_and_extract_metrics <- function(Target, Input_table, Trees, Importance, Classification, ...) {
  current <- data.frame(...)
  print(paste(row.names(current), "of", nrow(hyper_grid)))
  # rest of the function
}

# both return
> hyper_grid$res <- purrr::pmap(hyper_grid, fit_and_extract_metrics)
[1] "1 of 40"
[1] "1 of 40"
[1] "1 of 40"
...

1 Ответ

1 голос
/ 31 марта 2020

Поскольку вы уже используете pmap, самый простой способ - просто передать имена строк.

Вы можете сделать что-то вроде

hyper_grid$res <- purrr::pmap(cbind(hyper_grid, .row=rownames(hyper_grid)), fit_and_extract_metrics)

, которое просто добавляет .row вектор с именами строк. И затем в вашей итерирующей функции вы можете сделать

fit_and_extract_metrics <- function(Target, Input_table, Trees, Importance, Classification, ..., .row) {
  print(paste(.row, "of", nrow(hyper_grid)))
  # rest of the function
}

Обратите внимание, что я добавил параметр .row в функцию для захвата того нового столбца, который мы добавили.

Обратите внимание, что map() и walk() имеют версии, облегчающие получение итератора, называемые imap() и iwalk(), но pmap не имеет ipmap, предположительно, потому что вы должны выполнить всю работу, создавая список параметров, которые просто имеет смысл передавать имена или индексы, которые вы хотите.

...