Хобрук: Ваш путь к мастерству в программировании

Замените NA, имитируя данные

В векторе, содержащем блоки чисел и блоки NA, например:

score <- c(0,1,2,3,4,NA,NA,0,-1,0,1,2,NA,NA,NA)

есть ли способ имитировать пропущенные значения путем подсчета вверх по шагам от последнего значения до блока NA?

Таким образом, это будет:

score.correct <- c(0,1,2,3,4,5,6,0,-1,0,1,2,3,4,5)

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

r na
01.02.2013

Ответы:


1

Q+D, имеет цикл, делает некоторые ненужные добавления, но выполняет работу:

incna <- function(s){
  while(any(is.na(s))){
    ina = which(is.na(s))
    s[ina]=s[ina-1]+1
  }
  s
}


> score
 [1]  0  1  2  3  4 NA NA  0 -1  0  1  2 NA NA NA
> incna(score)
 [1]  0  1  2  3  4  5  6  0 -1  0  1  2  3  4  5

Сбой с только предупреждением, если первым элементом является NA:

> score
 [1] NA  1  2  3  4 NA NA  0 -1  0  1  2 NA NA NA
> incna(score)
 [1]  5  1  2  3  4  5  3  0 -1  0  1  2  3  4  5
Warning message:
In s[ina] = s[ina - 1] + 1 :
  number of items to replace is not a multiple of replacement length
01.02.2013

2

Взято из Кристоса Хатзиса на r-help:

rna <- function(z) { 
  y <- c(NA, head(z, -1))
  z <- ifelse(is.na(z), y+1, z)
  if (any(is.na(z))) Recall(z) else z }

rna(score)
#[1]  0  1  2  3  4  5  6  0 -1  0  1  2  3  4  5

Драконы:

rna(c(NA,score))
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

rna(c(1,rep(NA,1e4)))
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

Ориентир:

score2 <- 1:1e5
set.seed(42)
score2[sample(score2,10000)] <- NA
library(microbenchmark)
microbenchmark(rna(score2),incna(score2))

Unit: milliseconds
           expr      min        lq    median        uq       max
1 incna(score2)  2.93309  2.973896  2.990988  3.134501  5.360186
2   rna(score2) 50.42240 50.848931 51.228040 52.778043 56.856773
01.02.2013
  • Ой! Мои драконы не такие плохие, как ваши драконы! 01.02.2013
  • @Spacedman: Ваша функция тоже кажется быстрее. Но рекурсия — это весело. 01.02.2013
  • Контрольные показатели будут зависеть от количества последовательных NAs. Попробуйте score <- c(1, rep(NA, 1000))... 01.02.2013

  • 3

    Вот еще один подход:

    library(zoo)
    ifelse(is.na(score), na.locf(score) + sequence(rle(is.na(score))$l), score)
    #  [1]  0  1  2  3  4  5  6  0 -1  0  1  2  3  4  5
    

    Показаны промежуточные результаты, где [] указывает на NA слотов:

    na.locf(score)
    #  [1]  0  1  2  3  4  [4]  [4]  0 -1  0  1  2  [2]  [2]  [2]
    sequence(rle(is.na(score))$l)
    #  [1]  1  2  3  4  5  [1]  [2]  1  2  3  4  5  [1]  [2]  [3]
    na.locf(score) + sequence(rle(is.na(score))$l)
    #  [1]  1  3  5  7  9  [5]  [6]  1  1  3  5  7  [3]  [4]  [5]
    ifelse(is.na(score), na.locf(score) + sequence(rle(is.na(score))$l), score)
    #  [1]  0  1  2  3  4  [5]  [6]  0 -1  0  1  2  [3]  [4]  [5]
    
    01.02.2013
    Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

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

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..