按R中的自定义范围对数据进行分组(例如,0-4,1-5,2-6,3-7等)
问题描述:
我正在使用来自https://www.kaggle.com/c/titanic的泰坦尼克号数据集。按R中的自定义范围对数据进行分组(例如,0-4,1-5,2-6,3-7等)
我想让“0-4”,“1-5”,“2-6”,“3-7”等不同的年龄段,并找出存活百分比的年龄组最高。我的年龄组在整数区间内[0,80]。原始数据集中的“Age”列也包含NAs。 “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)}
答
首先我会编一些数据。
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)
答
一种方法做到这一点是制表按年龄的一切,然后把这些成团。然后递归地使用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)
答
的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
。
您的群组重叠,“0-4”,“1-5”,“2-6”,“3-7”'。 “Age == 3”的值是什么组合,所有这些? –
是的,年龄== 3属于几个年龄组。我明白这很荒谬。但是如果有可能写出一个循环或者用这样的组合来制作一张桌子,以便找出step = 5的每个年龄段的幸存者的存活率? – iomedee