求助:用for循环与if语句筛选泰坦尼克号符合条件的女性乘客信息
泰坦尼克号乘客数据筛选问题解决
你的代码存在三个核心问题:
- 循环范围错误:
for (i in 1)仅遍历第1行,需覆盖数据集所有行,应改为1:nrow(titanicDataset) - 条件维度不匹配:
titanicDataset$sex == "female"未指定行索引[i],会返回整列布尔向量,导致if条件长度大于1触发报错 - 空值判断逻辑错误:判断
i == ""完全无效,i是行号不可能为空,应检查home.dest[i]是否为缺失值
修正后的代码
# 加载titanic包并获取数据集 library(titanic) titanicDataset <- titanic_train # 遍历数据集每一行 for (i in 1:nrow(titanicDataset)) { # 提取当前行的各项数据,提升代码可读性 current_age <- titanicDataset$Age[i] current_embarked <- titanicDataset$Embarked[i] current_sex <- titanicDataset$Sex[i] current_home_dest <- titanicDataset$Home.Dest[i] # 多条件判断:过滤符合要求的乘客,同时跳过缺失值 if (!is.na(current_age) && current_age >= 50 && current_embarked == "S" && current_sex == "female" && !is.na(current_home_dest)) { print(current_home_dest) } }
代码说明
- 提取单条记录的变量,避免重复写索引,逻辑更清晰
- 加入
!is.na(current_age)是因为Age列存在缺失值,防止NA参与比较导致判断异常 - 使用
&&进行单值逻辑判断,比&更高效(&用于逐元素的向量判断) - 最后通过
!is.na(current_home_dest)确保只输出非空的目的地
额外参考:R风格的向量式写法(无需for循环)
如果不局限于for循环,用dplyr可以更简洁实现需求:
library(dplyr) library(titanic) titanic_train %>% filter(Sex == "female", Age >= 50, Embarked == "S", !is.na(Home.Dest)) %>% pull(Home.Dest)
内容的提问来源于stack exchange,提问作者na3413
相关产品推荐
相关产品推荐

