【问题标题】:Grouping data by custom range in R (for example, 0-4, 1-5, 2-6, 3-7 and etc.)在 R 中按自定义范围对数据进行分组(例如,0-4、1-5、2-6、3-7 等)
【发布时间】:2018-03-29 17:29:26
【问题描述】:

我正在使用来自https://www.kaggle.com/c/titanic 的泰坦尼克号数据集。

我想制作不同的年龄组,例如“0-4”、“1-5”、“2-6”、“3-7”等,并找出存活百分比为最高。我的年龄组在整数区间 [0,80] 内。原始数据集中的“年龄”列也包括 NA。 “幸存”列包含该人是否幸存的信息(0 = 否,1 = 是)。

我试图像这样解决这个问题,但没有奏效。如有任何帮助,我将不胜感激。

for(i in 0:80){
max= -Inf
x[i]<-(sum(subset(dataset, Age < (i+5) & Age >= i, select = "Survived")))/(length(which(dataset$Age < (i+5) & dataset$Age>= i)))
if (x[i] > max) max <- x[i]
return(max, i, i+5)}

【问题讨论】:

  • 您的群组重叠,"0-4", "1-5", "2-6", "3-7"Age == 3 的值属于哪个组,所有这些?
  • 是的,Age == 3 分为几个年龄段。我明白这很荒谬。但是,如果有任何可能编写一个循环或用这样的组制作一个表格,以找出每个年龄组的存活率,step=5?

标签: r data.table grouping aggregation categorization


【解决方案1】:

首先我会补一些数据。

set.seed(1234)   # make it reproducible
Age <- sample(c(NA, 1:80), 200, TRUE)
Survived <- sample(0:1, 200, TRUE)

现在是代码。定义一个函数将cut的输入分成组,而lapply该函数以每个组开始,从03

fun <- function(i, x){
    as.character(cut(x, breaks = seq(i, 80, by = 5), include.lowest = TRUE))
}

res <- unlist(lapply(0:3, fun, Age))
table(res)

res_surv <- unlist(lapply(0:3, fun, Age[Survived == 1]))
table(res_surv)

如果你想要百分比,你可以这样做

tbl_surv <- table(res_surv)
100*tbl_surv/sum(tbl_surv)

【讨论】:

    【解决方案2】:

    OP 已要求

    找出存活率最高的年龄组

    有一种可能的解决方案是使用非等值连接

    library(data.table)
    library(titanic)
    dataset <- as.data.table(titanic_train)
    delta <- 4
    max_age <- 80
    dataset[
      .(lower = seq(0, max_age - delta), upper = seq(delta, max_age)), 
      on = .(Age >= lower, Age <= upper), .SD[, .N, by = Survived], by = .EACHI][
        , total.N := sum(N), by = Age][, share := N / total.N][]
    
         Age Age Survived  N total.N     share
      1:   0   4        1 27      40 0.6750000
      2:   0   4        0 13      40 0.3250000
      3:   1   5        0 13      37 0.3513514
      4:   1   5        1 24      37 0.6486486
      5:   2   6        0 12      33 0.3636364
     ---                                      
    137:  72  76        0  1       1 1.0000000
    138:  73  77        0  1       1 1.0000000
    139:  74  78        0  1       1 1.0000000
    140:  75  79       NA  1       1 1.0000000
    141:  76  80        1  1       1 1.0000000
    

    到目前为止的结果表明,只有一名乘客幸存的年龄组的存活率最高,为 100%。这是微不足道的,可能不是 OP 正在寻找的结果。要么必须扩大delta,要么必须应用每个年龄段乘客绝对数量的阈值,例如total.N &gt; 2

    【讨论】:

      【解决方案3】:

      一种方法是按年龄将所有内容制成表格,然后将它们分组。然后递归地使用lag() 函数添加每组五行。假设数据框(df)有两列,AgeSurvived(0 或 1):

      library(dplyr)
      
      df %>% group_by(Age) %>% 
        summarize(n = n(), Survived = sum(Survived)) %>% 
        arrange(Age) %>% 
        mutate(Age_Group = paste0(Age-4, "-", Age)) %>% 
        mutate_at(vars(n, Survived), 
        funs(. + lag(.) + lag(lag(.)) + lag(lag(lag(.))) + lag(lag(lag(lag(.)))))) %>% 
        mutate(SurvivalRate = Survived/n) %>% 
        filter(!is.na(n)) %>% 
        select(-Age)
      

      【讨论】:

        猜你喜欢
        • 2021-02-15
        • 2023-01-20
        • 2021-05-30
        • 1970-01-01
        • 2022-10-08
        • 2015-01-22
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        相关资源
        最近更新 更多