R语言for循环嵌套if处理泰坦尼克号数据时警告报错如何修复?
问题原因
你写的代码存在3个核心错误:
- if条件直接调用了整列
titanic1$Gender、titanic1$Survived,返回的是长度等于数据集行数的逻辑向量,而if语句仅支持处理长度为1的逻辑值,因此触发了“条件长度>1,仅使用第一个元素”的警告。 - 逻辑判断规则错误:单条数据的
Gender字段不可能同时等于“Male Child”、“Female Child”、“Female Adult”三个值,该条件永远不可能成立,无法得到正确结果。 - 未按
Ticket分组处理:需求要求对同票号的所有乘客统一判断,你原来的逻辑是逐行判断单条乘客属性,不符合分组计算要求。
修复方案
方法1:使用dplyr包实现(推荐,代码简洁易读)
用分组聚合逻辑直接实现需求:
library(dplyr) titanic1 <- titanic1 %>% # 按票号分组 group_by(Ticket) %>% mutate( GroupAllFemalesBoysLived = ifelse( # 判断组内所有男童、女童、成年女性是否全部幸存 all(Survived[Gender %in% c("Male Child", "Female Child", "Female Adult")] == 1), 1, 0 ) ) %>% # 取消分组,避免后续操作受分组影响 ungroup()
注意:如果同票号下没有男童、女童、成年女性这类需要校验的人群,all()对空向量返回TRUE,会默认赋值为1;如果需要这类场景赋值为0,可以修改判断条件为:sum(check_person) > 0 && all(Survived[check_person] ==1),其中check_person <- Gender %in% c("Male Child", "Female Child", "Female Adult")
方法2:基础R实现(无需安装额外依赖包)
使用ave()函数实现分组计算:
titanic1$GroupAllFemalesBoysLived <- ave( 1:nrow(titanic1), titanic1$Ticket, FUN = function(idx) { sub_data <- titanic1[idx, ] # 筛选需要校验的人群 check_mask <- sub_data$Gender %in% c("Male Child", "Female Child", "Female Adult") # 判断是否全部幸存 as.integer(all(sub_data$Survived[check_mask] == 1)) } )
内容的提问来源于stack exchange,提问作者Treasured2005
相关产品推荐
相关产品推荐

