Удалить & ldquo; NA & rdquo; из некоторых конкретных ячеек кадра данных. Не все из них

Я создал библиотеку управления дочерними процессами, где отслеживается родительский процесс и дочерний процесс из-за двунаправленного WCF-канала. Если либо дочерний процесс завершается, либо прерывается родительский процесс, он уведомляется. Существует также доступный помощник отладчика, который автоматически присоединяет отладчик VS к запущенному дочернему процессу

Сайт проекта:

http://www.crawler-lib.net/ дочерние процессы

Пакеты NuGet:

https://www.nuget.org/packages/ChildProcesses https: / /www.nuget.org/packages/ChildProcesses.VisualStudioDebug/

-2
задан Rui Barradas 13 July 2018 в 15:17
поделиться

1 ответ

Это можно сделать только с использованием базы R.

Я буду работать с копиями данных с именами dat1 и dat2. Первые будут относить медиану всех непустых значений к отсутствующим значениям. Последний будет удалять верхние и нижние значения из векторов перед вычислением медианов.

dat1 <- dat2 <- dat    # Make two copies of the data

dat1[] <- lapply(dat, function(x){
  if(anyNA(x)){
    inx <- which(is.na(x))
    x[inx] <- median(x, na.rm = TRUE)
    c(x[-inx], x[inx])
  } else x
})

dat2[] <- lapply(dat, function(x){
  if(anyNA(x)){
    inx <- which(is.na(x))
    x_tmp <- x[-inx]
    x[inx] <- median(x_tmp[-c(1, length(x_tmp))], na.rm = TRUE)
    c(x[-inx], x[inx])
  } else x
})

dat1
#    A  B  C  D  E  F
#1  12 98 84 28 34 34
#2  34 34 29 29 24 67
#3  98 76 28 90 23 67
#4  29 23 28 89 56 45
#5  84 98 28 28 46 67
#6  87 43 27 20 34 34
#7  87 23 85 49 34 67
#8  32 43 28 39 34 30
#9  43 43 28 90 34 65
#10 93 43 28 39 34 65

dat2
#   A  B  C  D  E  F
#1  12 98 84 28 34 34
#2  34 34 29 29 24 67
#3  98 76 28 90 23 67
#4  29 23 28 89 56 45
#5  84 98 28 28 46 67
#6  87 43 27 20 24 34
#7  87 23 85 49 24 67
#8  32 43 28 39 24 30
#9  43 43 28 90 24 65
#10 93 43 28 39 24 67

Изменить.

Следующая функция выполняет то, что делают обе анонимные функции выше. Все, что необходимо, - это установить аргументы в соответствующие значения.

Обратите внимание, что тесты сравнивают результаты с результатами оригинала выше.

imputeStat <- function(x, stat = median, remove = c("top", "bottom")){
  if(anyNA(x)){
    inx <- which(is.na(x))
    x_tmp <- x[-inx]
    if("top" %in% remove) inx_rem <- 1
    if("bottom" %in% remove) inx_rem <- c(inx_rem, length(x[-inx]))
    if(is.logical(remove)){
      if(!remove) x[inx] <- median(x, na.rm = TRUE)
    }else{
      x[inx] <- median(x_tmp[-inx_rem], na.rm = TRUE)
    }
    c(x[-inx], x[inx])
  } else x
}

dat3 <- dat
dat3[] <- lapply(dat3, imputeStat, remove = FALSE)
identical(dat1, dat3)
#[1] TRUE

dat4 <- dat
dat4[] <- lapply(dat4, imputeStat)
identical(dat2, dat4)
#[1] TRUE

Данные.

dat <- read.table(text = "
    A   B   C   D   E   F
1   12  NA  NA  28  NA  NA
2   34  NA  NA  29  NA  34
3   98  98  NA  90  NA  67
4   29  34  84  NA  NA  67
5   84  NA  29  89  NA  45
6   87  76  28  28  34  67
7   87  23  28  20  24  34
8   32  98  28  49  23  67
9   43  43  27  39  56  30
10  93  23  85  90  46  65
", header = TRUE)
0
ответ дан Rui Barradas 17 August 2018 в 12:31
поделиться
  • 1
    Спасибо Руи Баррадасу. Код, который вы предложили, сделал трюк. Не могли бы вы объяснить, что он делает? И вот еще. Так как он сдвигает ячейки каждого столбца вверх, значит, в конце есть пустые места. Он заполняет эти пространства медианой тоже. Можно ли их избежать? Я просто хочу заполнить эти пустые пространства медианами, которые лежат между данными в столбце. Не на крайних концах (сверху или снизу). – Mitesh Somani 14 July 2018 в 02:03
  • 2
    @MiteshSomani Я не понимаю, что вы подразумеваете под & quot; не на крайних концах (сверху или снизу) & quot; . В столбце C это будет медианным после удаления 84 (верхний) и 85 (внизу)? – Rui Barradas 14 July 2018 в 15:16
  • 3
    @MiteshSomani Done, посмотрите, хочет ли второй lapply то, что вы хотите. – Rui Barradas 14 July 2018 в 15:55
  • 4
    Большое спасибо за ваш быстрый ответ, и позвольте мне объяснить. Давайте сейчас забудем о медианном. Нам нужно сначала сделать это, если NA находится в НАЧАЛЕ любого столбца, тогда нам нужно удалить этот NA и сдвинуть под собой ячейки только для этого столбца. Это не должно влиять на другие столбцы. Это то, что я показал в первоначальном вопросе. Давайте перейдем к этому, и мы перейдем к медианной части. – Mitesh Somani 14 July 2018 в 16:38
  • 5
    @MiteshSomani Код, который я опубликовал, работает в столбце по столбцам, он не влияет на другие столбцы. Что касается сдвига, вы должны немедленно его решить, если нет, как вы узнаете, какие элементы столбца должны измениться, когда все NA исчезли? – Rui Barradas 14 July 2018 в 16:48
Другие вопросы по тегам:

Похожие вопросы: