基于Base R,如何从仅含Survived列的泰坦尼克数据中推导死亡数据?
问题描述
现有泰坦尼克数据集仅包含Survived列(0代表未存活,1代表存活),无单独的死亡相关列。已通过Base R编写如下代码,计算不同舱位、性别的成年人员存活比例,现需处理数据推导死亡人员的相关数据:
propCS <- matrix(, nrow = 3, ncol = 2) dataChildren <- data[data$Age > 18,] dataMale <- dataChildren[dataChildren$Sex == "male",] dataFirst <- dataMale[dataMale$Pclass == "First", ] dataSecond <- dataMale[dataMale$Pclass == "Second", ] dataThird <- dataMale[dataMale$Pclass == "Third", ] propCS[1,1] <- sum(dataFirst$Survived) / length(dataFirst$Survived) propCS[2,1] <- sum(dataSecond$Survived) / length(dataSecond$Survived) propCS[3,1] <- sum(dataThird$Survived) / length(dataThird$Survived) dataFemale <- dataChildren[dataChildren$Sex == "female",] dataFirst <- dataFemale[dataFemale$Pclass == "First", ] dataSecond <- dataFemale[dataFemale$Pclass == "Second", ] dataThird <- dataFemale[dataFemale$Pclass == "Third", ] propCS[1,2] <- sum(dataFirst$Survived) / length(dataFirst$Survived) propCS[2,2] <- sum(dataSecond$Survived) / length(dataSecond$Survived) propCS[3,2] <- sum(dataThird$Survived) / length(dataThird$Survived)
解决方案
死亡比例的计算逻辑非常直接:死亡比例 = 1 - 存活比例,因为每个分组的总人数固定,存活与死亡的占比之和为1。下面提供两种实现方式:
方式一:基于现有propCS矩阵直接推导
如果已经运行完原代码得到了存活比例矩阵propCS,只需一行代码就能生成死亡比例矩阵:
# 生成死亡比例矩阵 propCS_death <- 1 - propCS # 可选:为矩阵添加维度名称,提升可读性 dimnames(propCS_death) <- list(c("First", "Second", "Third"), c("Male", "Female"))
方式二:重构原代码,同时计算存活与死亡比例
原代码存在大量重复的子集创建操作,可通过aggregate函数简化分组计算流程,一次性得到存活和死亡比例:
# 筛选成年人员(年龄>18) adult_data <- data[data$Age > 18, ] # 按舱位、性别分组,同时计算存活和死亡比例 survive_death_stats <- aggregate( Survived ~ Pclass + Sex, data = adult_data, FUN = function(x) { surv_prop <- sum(x) / length(x) death_prop <- 1 - surv_prop return(c(Survived = surv_prop, Died = death_prop)) } ) # 可选:转换为矩阵格式(与原propCS结构对应) # 存活比例矩阵 propCS_survive <- matrix( survive_death_stats$Survived, nrow = 3, ncol = 2, dimnames = list(c("First", "Second", "Third"), c("Male", "Female")) ) # 死亡比例矩阵 propCS_death <- matrix( survive_death_stats$Died, nrow = 3, ncol = 2, dimnames = list(c("First", "Second", "Third"), c("Male", "Female")) )
说明
- 重构后的代码避免了重复创建子集,代码更简洁且易维护
- 两种方式得到的死亡比例数据完全一致,可根据实际需求选择使用
内容的提问来源于stack exchange,提问作者IanAnthony1
相关产品推荐
相关产品推荐

