r - 是否有一个 R 函数可以为一组变量的每个值减去不同的中位数?
问题描述
我有一个带有变量 question_ID 的数据框,并估计向 32 人提出了 210 个问题(所以 6720 obs。)。我想计算每个估计的 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 个子集的优雅解决方案。有任何想法吗?
提前致谢!
解决方案
您可以使用基本 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))
})
请注意,如果响应数为偶数,则对数的中位数与中位数的对数并不完全相同。小心你想要什么。
推荐阅读
- java - 如何从单个 Docker 容器中捕获多个日志流?
- makefile - 如何抑制 Makefile 中的所有默认变量和默认隐式规则?
- python - 按列名重新排序熊猫数据框中的列
- reactjs - 如何在 reactjs 的多个文件和类中使用一个导入
- r - 如何在 R 中的第一个位置为列表的每个对象添加一个值
- python-2.7 - Luigi 任务可视化器依赖关系图为空
- db2 - IBM IDAA 不允许我查询特定列
- javascript - 打字稿将属性视为未定义,当它被定义时
- postgresql - 有没有办法强制更新查询在 postgreSQL 中设置列值?
- javascript - 从嵌套对象中获取数据