Существует ли функция R для вычитания различных медиан для каждого значения группы переменной? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть фрейм данных с переменными question_ID и оценка с 210 вопросами, заданными 32 людям (таким образом, 6720 наблюдений). Я хочу вычислить log10 для каждой оценки и вычесть медиану журналов для каждого вопроса.

Например, для вопроса 1: Sum (log (Estimates1) -median1) / 32, для вопроса 2: Sum (log (Estimates2) -median2) / 32 и так далее до 210. Так что в конце I надеюсь, для каждого вопроса будет 210 значений.

До сих пор я рассчитывал медиану для каждого вопроса:

m <- data %>% group_by(question_ID) %>% summarize(m=median(log10(estimate)))

Я ищу элегантное решение, в котором я не надену не нужно придумать 210 подмножеств. Есть идеи?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вы можете сначала вычислить log из estimates и для каждого вопроса вычесть его из значения median, sum их и разделить на 32.

library(dplyr)

data %>% 
 mutate(log_m = log10(estimate)) %>% 
 group_by(question_ID) %>% 
 summarize(m = sum(log_m - median(log_m))/32)
0 голосов
/ 27 февраля 2020

Вы можете сделать это, используя базовые функции R. ave применяет функцию к вектору по подмножествам и возвращает результат той же длины, что и исходный вектор.

# Calculate the medians within the dataframe using the ave function
data$logmedians <- ave( log(data$estimate,10) , data$question_ID, FUN=median)

# Now generate the difference between the log medians and the individual answers
data$diflogs <- log(data$estimate, 10) - data$logmedians

Я думаю, что это самый простой способ понять. Вы можете очистить вещи, используя within и выполнив весь расчет в функции ave:

data <- within(data,{
   diflogs <- ave(estimate, question_ID, FUN=function(x) log(x,10) - median(log(x,10))
   })

Обратите внимание, что медиана журналов не совсем совпадает с медианой журналов, если есть четное количество ответов. Будьте осторожны с тем, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...