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

Функция применения занимает в 100 раз больше времени, чем цикл For в R

Я столкнулся с огромной разницей во времени между циклом for и функцией apply.

У меня есть кадр данных (alldat), который содержит около 200 тыс. записей с 73 столбцами. Я хочу проверить, каков процент NA в каждом столбце, и вернуть результат в виде нового DF для проверки. Я сделал это 2 способами:

1) функция с циклом for:

Nacheck = function(a){
    a <- as.data.frame(a)
    vecNA <- rep(NA, dim(a)[2])
    for (i in 1:dim(a)[2]){
        vecNA[i] <- sum(is.na(a[, i]))
        }
    rowss <- rep(nrow(a), length(vecNA))
    NA_PCT <- vecNA/rowss
    colna <- colnames(a)
    datacheck <- as.data.frame(t(rbind(colna, NA_PCT)))
    return(datacheck)
}
datacheck1 = Nacheck(alldat)

2) apply функция по столбцу:

datacheck <- as.data.frame(apply(alldat,2,function (x) round(sum(is.na(x))/dim(alldat)[1], digits = 2)))

функция apply занимает 4 секунды, а функция цикла for занимает менее 0,023 секунды

start.time <- Sys.time()
datacheck <- as.data.frame(apply(alldat,2,function (x) round(sum(is.na(x))/dim(alldat)[1], digits = 2)))
end.time <- Sys.time()
time.takenapply <- end.time - start.time
time.takenapply

Разница во времени 4,304 секунды

for время цикла:

start.time <- Sys.time()
datacheck = Nacheck(alldat)
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Разница во времени 0,02399993 сек.

Я делаю что-то неправильно? Любая идея, что вызывает эту разницу во времени?

05.07.2017

  • Функция apply принимает в качестве аргумента матрицу. Внутреннее преобразование входных данных в матрицу может вызвать эту разницу во времени. Также вместо этого я бы использовал lapply, так как вы выполняете вычисления по столбцам. 05.07.2017
  • Не причина этого, но почему бы не использовать nrow(a),ncol(a) вместо dim(a)[1],dim(a)[2] ? 05.07.2017
  • Пожалуйста, приведите воспроизводимый пример 05.07.2017
  • Может попробовать colMeans(is.na(alldat)) 05.07.2017
  • Натраве Дрова и Ярко Дуббельдам, вы правы, я использовал его с lapply, и это исправило разницу во времени. digEmAll - не особая причина (я новичок в r) спасибо всем за быстрый ответ. 05.07.2017

Ответы:


1

Кадры дат внутренне очень похожи на списки, где каждый столбец является отдельной записью в списке. Вы можете увидеть это, используя оператор $. Это позволяет указать столбец, аналогично указанию именованной записи в списке.

Когда вы делаете apply, как уже упоминала Натраве Дрова в комментариях, вы неявно конвертируете весь свой фрейм данных в матрицу. Если ваш фрейм данных имеет разные типы данных, такие как столбцы чисел и столбцы символов, он приводит все значения к общему типу (обычно символьному). Если ваш фрейм данных большой (и 200 тыс. * 73 значения, которые должны быть принуждаемыми, считаются большими), это может быть очень дорогостоящей операцией.

Поэтому, если вы хотите правильно сравнить функции *apply с циклами for, вам следует попробовать вместо этого lapply.

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

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

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

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

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

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

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

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