Mutate (dplyr 1.0.10) 不更新已经改变的值

问题描述 投票:0回答:1

在这个简化的例子中......我目前正在尝试根据年龄(名为“年龄”的列)和就业状况(名为“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(或任何其他函数)覆盖值如果后续快递满意吗?

r dplyr mutate
1个回答
0
投票

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 所指出的
&
&&
具有不同的含义。

© www.soinside.com 2019 - 2024. All rights reserved.