在这个简化的例子中......我目前正在尝试根据年龄(名为“年龄”的列)和就业状况(名为“emp_stat”的列)将一个人分类。我想将人员分为“儿童”、“工人”、“失业”和“退休人员”,将结果保存在新列“per_type”中。我试图通过以下方式做到这一点:
persons<-
persons %>%
mutate(per_type = case_when(
(age < 18) ~ "child",
(age >= 18 and age < 65) & (emp_stat = "emp") ~ "worker",
(age >= 65) ~ "retiree",
(age >= 65) & (emp_stat = "emp") ~ "worker",
True ~ "unemployed"
))
运行此代码后,我希望看到:
每 | 年龄 | emp_stat | 每类型 |
---|---|---|---|
1 | 16 | unem | 孩子 |
2 | 45 | unem | 失业 |
3 | 66 | unem | 退休人员 |
4 | 70 | emp | 工人 |
5 | 55 | emp | 工人 |
我实际看到的:
每 | 年龄 | emp_stat | 每类型 |
---|---|---|---|
1 | 16 | unem | 孩子 |
2 | 45 | unem | 失业 |
3 | 66 | unem | 退休人员 |
4 | 70 | emp | 退休人员 |
5 | 55 | emp | 工人 |
人 4 被归类为“退休人员”,而不是“工人”。我的假设是 mutate 仅填充先前未调整/更改的行中的值。在这种情况下,由于 (age >= 65) ~ "retiree" 出现在 (age >= 65) & (emp_stat = "emp") ~ "worker 之前,单元格已经有一个值,因此没有打扰根据第二个表达式进行调整。
我知道在这个简单的例子中我可以轻松地交换两个表达式,但在我的实际工作中这不能那么容易地完成,所以我想知道是否有一种方法可以让 mutate(或任何其他函数)覆盖值如果后续快递满意吗?
case_when
在满足正确的值后中止。要获得所需的结果,请更改条件顺序:
persons<-
persons %>%
mutate(per_type = case_when(
(age < 18) ~ "child",
(age >= 18 & age < 65) & (emp_stat == "emp") ~ "worker",
(age >= 65) & (emp_stat == "emp") ~ "worker",
(age >= 65) ~ "retiree",
TRUE ~ "unemployed"
))
还要注意语法:
==
用于比较;
TRUE
拼写为大写或简单地拼写为 T
并且正如@jaret_marmot 所指出的 &
,&&
具有不同的含义。