我一直在使用Kaggle的Titanic数据集。我一直试图使用一个ifelse条件,目的是做一些特征工程工作,但不幸的是我已经被我的if else条件震惊,这不会产生错误,但同时根本不工作。我做错了什么,我该怎么处理?这是我的代码:
if(train$titles=="Dr" && train$Sex=="male"){
train$titles<-"Mr"
}else if(train$titles=="Dr" && train$Sex=="female"){
train$titles<-"Mrs"
}
这是我的输出,前后相同:
> table(train$titles)
Mr Mrs Dr Miss
571 128 7 185
这是因为我遗漏了最后的条件吗?
问题是,如果if中的条件完全不匹配,那么我不想更改列中的值(即我希望它们按原样)。我该怎么办?
尝试逻辑索引。
inx <- train$titles == "Dr"
train$titles[inx & train$sex == "male"] <- "Mr"
train$titles[inx & train$sex == "female"] <- "Mrs"
另外,像用户Dan Y在对问题的评论中所说,在这里重复,因为有时评论被删除,
使用ifelse而不是if因为前者是矢量化的。
仍然使用如上定义的ifelse
的inx
解决方案可能是
train$titles[inx] <- ifelse(train$sex[inx] == "male", "Mr", "Mrs")
我使用inx
来避免更长的代码行。如果您愿意,可以将inx
的定义放在ifelse
的索引中。
你应该使用ifelse
,这是一个矢量化的形式,你会做你想要的:
train$titles = ifelse(train$titles=="Dr" & train$Sex=="male", "Mr", "Mrs")
另外,要小心difference between &
and &&
。
如果您有多个案例,则可以嵌套多个ifelse
语句。您可能也对dplyr::case_when
感兴趣。