我正在使用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)}
答案 0 :(得分:2)
首先我会补充一些数据。
set.seed(1234) # make it reproducible
Age <- sample(c(NA, 1:80), 200, TRUE)
Survived <- sample(0:1, 200, TRUE)
现在的代码。定义一个函数,cut
输入到组中,lapply
对每个组起作用,从0
到3
开始。
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
)有两列,Age
和Survived
(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)