【问题标题】:R: Summarizing Data At Multiple LevelsR:在多个级别汇总数据
【发布时间】:2023-01-24 13:40:11
【问题描述】:

我正在使用 R 编程语言。

我有以下关于体重和哮喘患者的数据集(1 = 是,0 = 否):

library(dplyr)
library(purrr)
library(ggplot2)
set.seed(123)

my_data1 = data.frame(Weight =  rnorm(500,100,100), asthma = sample(c(0,1), prob = c(0.7,0.3), replace=TRUE, size= 500))
my_data2 = data.frame(Weight = rnorm(500, 200, 50),  asthma = sample(c(0,1), prob = c(0.3,0.7), replace=TRUE, size= 500))
my_data_a = rbind(my_data1, my_data2)
my_data_a$gender =  "male"


my_data1 = data.frame(Weight =  rnorm(500,100,100), asthma = sample(c(0,1), prob = c(0.7,0.3), replace=TRUE, size= 500))
my_data2 = data.frame(Weight = rnorm(500, 200, 50),  asthma = sample(c(0,1), prob = c(0.3,0.7), replace=TRUE, size= 500))
my_data_b = rbind(my_data1, my_data2)
my_data_b$gender =  "female"


my_data = rbind(my_data_a, my_data_b)
my_data$id = 1:2000

我的问题:对于两种性别,我想根据可用的体重范围(例如 min_weight_men : min_weight_men+ 30 = bin_1_men, min_weight_women : min_weight_women+ 30 = bin_1_women, min_weight_men+ 30 : min_weight_men+ 60 = bin_2_men, 等)按升序将此数据集中的人“分箱”到“n”箱(例如 n = 30) - 然后找出有多少每个垃圾箱中的人,以及每个垃圾箱的最小重量和最大重量。

我的尝试:我尝试使用以下代码执行此操作:

Part_1 = my_data %>% group_by(gender) %>%
    mutate(bins = cut(Weight , breaks = pretty(Weight , n = (max(Weight)-min(Weight))/30), include.lowest = TRUE)) %>% 
 mutate(rank = dense_rank(bins)) %>% 
mutate(new_bins = paste(rank,"_", gender, sep=""))

Part_2 = Part_1 %>% group_by(gender, bins) %>% 
    summarize(min_weight = min(Weight), max_weight = max(Weight), count = n())

Part_3 = merge(x=Part_1,y=Part_2, by.x=c("gender","bins"), by.y=c("gender","bins"))

虽然结果是我想要的格式 - 我不确定我是否正确执行了计算:

> head(Part_3)
  gender       bins    Weight asthma   id rank new_bins min_weight max_weight count
1 female (-100,-50] -75.13021      0 1192    4 4_female  -99.91774  -51.53241    23
2 female (-100,-50] -55.78222      0 1382    4 4_female  -99.91774  -51.53241    23
3 female (-100,-50] -51.53241      0 1232    4 4_female  -99.91774  -51.53241    23
4 female (-100,-50] -71.44877      1 1484    4 4_female  -99.91774  -51.53241    23
5 female (-100,-50] -93.99402      1 1160    4 4_female  -99.91774  -51.53241    23
6 female (-100,-50] -96.49823      0 1378    4 4_female  -99.91774  -51.53241    23

如果我做对了,有人可以帮我理解吗?

谢谢!

注意:澄清一下——假设男性的体重在 70 公斤到 150 公斤之间。我想要 bin_1_men = 70-100kg、bin_2_men = 100-130kg 等垃圾箱。我知道这可能会导致某些垃圾箱的计数明显不同。

【问题讨论】:

  • @ akrun:Max 和 Min 对应于男性体重的最大和最小值 - 以及女性的最大和最小体重值
  • 在 Part_1 中,代码根据每个性别的总重量范围的总体最大/最小值计算男性和女性的 bin 宽度。在 Part_2 中,粘贴了每个 bin 的最大/最小值
  • 感谢您的更正 - 我会立即添加!
  • @阿克伦;请参阅第 1 部分中的更新。这是你的意思吗?谢谢!
  • 是的,我就是那个意思。谢谢

标签: r


【解决方案1】:

与其分 3 个步骤执行此操作,不如在分组后使用 mutate 在单个管道中完成

library(dplyr)
my_data %>% 
 group_by(gender) %>%
  mutate(bins = cut(Weight , breaks = pretty(Weight , 
   n = (max(Weight)-min(Weight))/30), include.lowest = TRUE),
  rank = dense_rank(bins),
 new_bins = paste(rank,"_", gender, sep="")) %>% 
 group_by(gender, bins) %>% 
 mutate(min_weight = min(Weight), max_weight = max(Weight), 
   count = n()) %>% 
 ungroup

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2019-11-04
    • 2017-10-26
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多