Nano Hash - криптовалюты, майнинг, программирование

Передача слота data.tables j (имена переменных, функции, а также аргументы) в качестве аргумента

Я хотел бы дать функции, которые будут выполняться в j-м слоте data.table в качестве аргументов в стиле:

   DT <- as.data.table(structure(list(peak.grp = c(1L, 2L, 2L, 2L, 2L), s = c(248, 264, 
282, 304, 333), height = c(222772.8125, 370112.28125, 426524.03125, 649691.75, 698039)), class = "data.frame", row.names = c(NA, 
-5L)))

list_of_functions_with_parameters <- list(sum = list(x = s, na.rm = TRUE), mean = list(x = height, na.rm = TRUE))

vector_of_variable_names <- c("Sum.s", "Mean.height")

vector_for_by <- c("peak.grp")

perform_dt_operations <-
    function(DT, vector_of_variable_names, list_of_functions_with_parameters, vector_for_by){

    DT <- DT[, .(vector_of_variable_names = list_of_functions_with_parameters), by = row.names(DT)]

    return(DT)

}

Результат должен быть таким:

Output <- perform_dt_operations(DT, vector_of_variable_names, list_of_functions_with_parameters, vector_for_by)


dput(as.data.frame(Output))

structure(list(peak.grp = c(1, 2), Sum.s = c(248, 1183), Mean.height = c(222772.8125, 
536091.765625)), row.names = c(NA, -2L), class = "data.frame")

Есть ли способ сделать что-то подобное?

19.08.2019


Ответы:


1

Это возможно только в том случае, если элементы list_of_functions_with_parameters заключены в кавычки, что означает, что это должен быть alist.

list_of_functions_with_parameters <- alist(sum = list(x = s, na.rm = TRUE), 
                                       mean = list(x = height, na.rm = TRUE))

vector_of_variable_names <- c("Sum.s", "Mean.height")

vector_for_by <- c("peak.grp")

perform_dt_operations <-
  function(DT, vector_of_variable_names, list_of_functions_with_parameters, vector_for_by){

    stopifnot(length(vector_of_variable_names) == length(list_of_functions_with_parameters))

    DT[,{
      res <- list()
      for (i in seq_along(vector_of_variable_names)) {
        l <- eval(list_of_functions_with_parameters[[i]]) #evaluate within .SD
        res[vector_of_variable_names[i]] <- 
              do.call(names(list_of_functions_with_parameters)[i], l)
      }
      res       
    }, by = vector_for_by]
  }

perform_dt_operations(DT, vector_of_variable_names,
  list_of_functions_with_parameters, vector_for_by)

#   peak.grp Sum.s Mean.height
#1:        1   248    222772.8
#2:        2  1183    536091.8

Как видите, это довольно сложный код. Я не уверен, что рекомендую этот подход.

19.08.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..