首页 > 解决方案 > 是否有一个 R 函数可以为一组变量的每个值减去不同的中位数?

问题描述

我有一个带有变量 question_ID 的数据框,并估计向 32 人提出了 210 个问题(所以 6720 ob​​s。)。我想计算每个估计的 log10 并减去每个问题的日志中位数。

例如对于问题 1:Sum(log(Estimates1)-median1)/32,对于问题 2:Sum(log(Estimates2)-median2)/32 等等直到 210。所以最后我希望每个都有 210 个值问题。

到目前为止,我计算了每个问题的中位数:

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

我正在寻找一个不需要提出 210 个子集的优雅解决方案。有任何想法吗?

提前致谢!

标签: rdplyr

解决方案


您可以使用基本 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))
   })

请注意,如果响应数为偶数,则对数的中位数与中位数的对数并不完全相同。小心你想要什么。


推荐阅读