У меня есть dataframe следующим образом:включают в себя только выбросы из каждого столбца в dataframe
chr leftPos TBGGT 12_try 324Gtt AMN2
1 24352 34 43 19 43
1 53534 2 1 -1 -9
2 34 -15 7 -9 -18
3 3443 -100 -4 4 -9
3 3445 -100 -1 6 -1
3 3667 5 -5 9 5
3 7882 -8 -9 1 3
я должен создать цикл, который:
а) Вычисляет верхние и нижние пределы (UL и LL) для каждого столбца из третьего столбца.
b) Включает только строки, которые падают за пределами UL и LL (Zoutliers).
c) Затем подсчитайте количество строк, в которых Zoutlier является одним и тем же направлением (то есть положительным или отрицательным), как предыдущие или последующий ряд для того же chr. Поэтому
Выход будет:
ZScore1 TBGGT 12_try 324Gtt AMN2
nrow 4 6 4 4
До сих пор у меня есть код следующим образом:
library(data.table)#v1.9.5
f1 <- function(df, ZCol){
#A) Determine the UL and LL and then generate the Zoutliers
UL = median(ZCol, na.rm = TRUE) + alpha*IQR(ZCol, na.rm = TRUE)
LL = median(ZCol, na.rm = TRUE) - alpha*IQR(ZCol, na.rm = TRUE)
Zoutliers <- which(ZCol > UL | ZCol < LL)
#B) Exclude Zoutliers per chr if same direction as previous or subsequent row
na.omit(as.data.table(df)[, {tmp = sign(eval(as.name(ZCol)))
.SD[tmp==shift(tmp) | tmp==shift(tmp, type='lead')]},
by=chr])[, list(.N)]}
nm1 <- paste0(names(df)
setnames(do.call(cbind,lapply(nm1, function(x) f1(df, x))), nm1)[]
Код склеиваются из разных мест. Проблема, которую я имею, состоит в объединении частей A) и B) кода для получения нужного результата.
Предполагается, что 'Zcol' должен быть по существу' 3: ncol (df) ', то есть все столбцы от числа 3 вперед или всего по одному столбцу за раз? –
Он должен вычислить его по одной колонке за раз. Я предполагаю, что вывод первой части кода должен дать мне все Z-outliers с chr и leftPos, в которых я думаю, что это так. Вторая часть должна затем взять этот столбец и для каждого chr затем оценить каждую строку, как описано. Это идея. Так что я должен пройти Zoutliers ко второй части? –
Если я просто сосредоточусь на первой части, как бы получить Zutliers с chr и leftPos, которые я мог бы передать во вторую часть проблемы –