Как я могу получить взвешенные квантили из малонаселенного фрейма данных? - PullRequest
0 голосов
/ 24 января 2020

Мне нужна помощь с добавлением некоторых столбцов во фрейм данных, которые, похоже, не могут быть правильными. Моя df составляет около 40 000 строк x 30 столбцов и имеет такую ​​структуру:

Key       0  1  2  3  4  5  6  7  8  9 10  11 12 13 14  15 16  17  18  19 20  21 22 23 24 25  NumNotNA
317862 2151 NA NA NA NA NA NA NA NA NA NA  NA NA NA NA  NA NA  NA  NA  NA NA  NA NA NA NA NA         0
317881 1105 51 33 98  8 27 56 28 17 39 11 112 14 87  7 273 56 189 245 119  7 147 25 NA NA NA        22
290507  111 56 28 NA NA NA NA NA NA NA NA  NA NA NA NA  NA NA  NA  NA  NA NA  NA NA NA NA NA         2
290509  196 NA NA NA NA NA NA NA NA NA NA  NA NA NA NA  NA NA  NA  NA  NA NA  NA NA NA NA NA         0
290520   91  0  2  1  4  1  1  0  0  0  1   1  4  0  1   0  5   0   1   0  1   0  0  4  1  0        25
290521   92  2  5 22  3  4  1 19  0  5  0   1 13  0  0   0  1   0   0   1  1   0 46 15  0  1        25

Я ищу, чтобы добавить 11 новых столбцов во фрейм данных, по одному для каждого взвешенного квантиля в последовательности seq (0,1 , 0,1). Я использую следующие весы косинуса для взвешивания наблюдений из имен столбцов 1:25 в df выше.

cosine_weights <- 1 + cos(pi*seq(0,24)/24)

Я могу получить значения, которые ищу, используя wtd.quantile ( ) функции как пакетов Hmis c, так и пакетов reldist в одной строке, но я не могу понять, как правильно использовать функции apply, чтобы применить это ко всему фрейму данных. Обратите внимание, что одна из проблем заключается в том, что несколько строк (например, строки 1 и 4 выше) содержат все значения NA для имен столбцов 1:25. Для этих строк я бы хотел, чтобы мои квантили также давали значения NA, но чтобы приводить действительные квантили для других строк.

Вот пример вывода, который я ищу из каждой строки, хотя я хотел бы добавить это как новые столбцы в мой существующий фрейм данных. Я пытался использовать это с mapply, но продолжаю сталкиваться с проблемами. Я должен привести данные к числовому значению c, чтобы вычислить их, но когда я пытаюсь применить их к полной df, он говорит, что мой объект (список) не может быть приведен к типу double. Кажется, что каждое исправление, которое я пробую, терпит неудачу, и я не могу найти другие подобные примеры в своих поисках.

> Hmisc::wtd.quantile(as.numeric(dat[6, 3:27]), weights=cosine_weights, probs = seq(0,1,0.1))
  0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
 0.0  0.0  0.0  1.0  1.6  3.0  4.0  5.0  6.6 20.8 46.0

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 24 января 2020

Мы можем написать функцию для вычисления желаемых значений

calculate_quantile <- function(x) {
   if (all(is.na(x))) return(rep(NA, 11))
   as.numeric(Hmisc::wtd.quantile(x, weights=cosine_weights, probs = seq(0,1,0.1)))
}

и применять ее по строкам, используя apply

dat[paste0('Q', 1:11)] <- t(apply(dat[3:27], 1, calculate_quantile))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...