gpt4 book ai didi

r - 如何使用 dplyr 计算 R 中的分组 z 分数?

转载 作者:行者123 更新时间:2023-12-04 18:01:41 24 4
gpt4 key购买 nike

使用 iris我正在尝试计算每个变量的 z 分数。通过执行以下操作,我获得了整洁格式的数据:

library(reshape2)
library(dplyr)
test <- iris
test <- melt(iris,id.vars = 'Species')

这给了我以下内容:
  Species     variable value
1 setosa Sepal.Length 5.1
2 setosa Sepal.Length 4.9
3 setosa Sepal.Length 4.7
4 setosa Sepal.Length 4.6
5 setosa Sepal.Length 5.0
6 setosa Sepal.Length 5.4

但是当我尝试为每个组创建一个 z-score 列时(例如,Sepal.Length 的 z-score 将无法与 Sepal.Width 的 z-score 相比),使用以下内容:
test <- test %>% 
group_by(Species, variable) %>%
mutate(z_score = (value - mean(value)) / sd(value))

生成的 z 分数尚未分组,而是基于所有数据。

使用 dpylr 按组返回 z 分数的最佳方法是什么?

非常感谢!

最佳答案

您的代码按组为您提供 z 分数。在我看来,这些 z 分数应该完全具有可比性,因为您已将每个组单独缩放为 mean=0 和 sd=1,而不是根据完整数据框的平均值和 sd 缩放每个值。例如:

library(tidyverse)

首先,设置熔化的数据框:
dat = iris %>% 
gather(variable, value, -Species) %>%
group_by(Species, variable) %>%
mutate(z_score_group = (value - mean(value)) / sd(value)) %>% # You can also use scale(value) as pointed out by @RuiBarradas
ungroup %>%
mutate(z_score_ungrouped = (value - mean(value)) / sd(value))

现在看前三行,和直接计算比较:
head(dat, 3)

# Species variable value z_score_group z_score_ungrouped
# 1 setosa Sepal.Length 5.1 0.2666745 0.8278959
# 2 setosa Sepal.Length 4.9 -0.3007180 0.7266552
# 3 setosa Sepal.Length 4.7 -0.8681105 0.6254145

# z-scores by group
with(dat, (value[1:3] - mean(value[Species=="setosa" & variable=="Sepal.Length"])) / sd(value[Species=="setosa" & variable=="Sepal.Length"]))

# [1] 0.2666745 -0.3007180 -0.8681105

# ungrouped z-scores
with(dat, (value[1:3] - mean(value)) / sd(value))

# [1] 0.8278959 0.7266552 0.6254145

现在可视化 z 分数:下面的第一张图是原始数据。第二个是未分组的 z 分数——我们刚刚将数据重新调整为整体均值 = 0 和 SD = 1。第三张图是您的代码生成的内容。每个组都已单独缩放为均值 = 0 和 SD = 1。
gridExtra::grid.arrange(
grobs=setNames(names(dat)[c(3,5,4)], names(dat)[c(3,5,4)]) %>%
map(~ ggplot(dat %>% mutate(group=paste(Species,variable,sep="_")),
aes_string(.x, colour="group")) + geom_density()),
ncol=1)

enter image description here

关于r - 如何使用 dplyr 计算 R 中的分组 z 分数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com