按R中的自定义范围对数据进行分组(例如,0-4,1-5,2-6,3-7等)

时间:2017-10-17 22:12:43

标签: r data.table grouping aggregation categorization

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

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

3 个答案:

答案 0 :(得分:2)

首先我会补充一些数据。

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)

答案 1 :(得分: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 > 2

答案 2 :(得分:0)

一种方法是按年龄将所有内容制成表格,然后将其分组。然后递归使用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)