首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按R中的自定义范围分组数据(例如0-4、1-5、2-6、3-7等)

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

Stack Overflow用户
提问于 2017-10-18 06:12:43
回答 3查看 602关注 0票数 0

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

我想把"0-4","1-5","2-6","3-7“等不同的年龄组,找出存活率最高的年龄组。我的年龄组在整数区间0,80内。原始数据集中的列"Age“也包括NAs。" survived“列包含此人是否幸存的信息(0 =否,1=是)。

我试着像这样解决这个问题,但它不起作用。如果有任何帮助,我将不胜感激。

代码语言:javascript
运行
复制
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)}
EN

回答 3

Stack Overflow用户

发布于 2017-10-18 06:53:54

首先,我将编造一些数据。

代码语言:javascript
运行
复制
set.seed(1234)   # make it reproducible
Age <- sample(c(NA, 1:80), 200, TRUE)
Survived <- sample(0:1, 200, TRUE)

现在来看代码。定义一个函数,将输入分组,并从03,将函数lapply到每个组。

代码语言:javascript
运行
复制
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)

如果你想要百分比,你可以用

代码语言:javascript
运行
复制
tbl_surv <- table(res_surv)
100*tbl_surv/sum(tbl_surv)
票数 2
EN

Stack Overflow用户

发布于 2017-10-29 20:31:17

操作员已请求

找出存活率最高的年龄组

有一种可能的解决方案是使用非equi join

代码语言:javascript
运行
复制
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%。这是微不足道的,可能不是操作员想要的结果。要么必须扩大delta,要么必须对每个年龄组的乘客绝对数量设定阈值,例如total.N > 2

票数 2
EN

Stack Overflow用户

发布于 2017-10-18 09:29:51

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

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46800031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档