Вы можете сделать это, используя базовые функции 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))
})
Обратите внимание, что медиана журналов не совсем совпадает с медианой журналов, если есть четное количество ответов. Будьте осторожны с тем, что вы хотите.