Я создал библиотеку управления дочерними процессами, где отслеживается родительский процесс и дочерний процесс из-за двунаправленного WCF-канала. Если либо дочерний процесс завершается, либо прерывается родительский процесс, он уведомляется. Существует также доступный помощник отладчика, который автоматически присоединяет отладчик VS к запущенному дочернему процессу
Сайт проекта:
http://www.crawler-lib.net/ дочерние процессы
Пакеты NuGet:
https://www.nuget.org/packages/ChildProcesses https: / /www.nuget.org/packages/ChildProcesses.VisualStudioDebug/
Это можно сделать только с использованием базы 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)
C
это будет медианным после удаления84
(верхний) и85
(внизу)? – Rui Barradas 14 July 2018 в 15:16lapply
то, что вы хотите. – Rui Barradas 14 July 2018 в 15:55NA
исчезли? – Rui Barradas 14 July 2018 в 16:48