首页 > 解决方案 > 使用 mutate (ifelse()) 创建新变量,但由于 NA 而得到错误答案

问题描述

我想创建一个新变量 c。第1步,如果a=1则c=1(不管b);步骤 2,如果 a=2 或 b=2,则 c=2。

a <- c (2, 2, 2, NA, NA, NA, 1, 1, 1)
b <- c (1, 2, NA, 1, 2, NA, 1, 2, NA)
ab <- data.frame (a, b)
abc <- ab %>% 
    mutate (c = ifelse (a == 1, 1, NA)) %>% 
    mutate (c = ifelse (a == 2 | b == 2, 2, c))

abc
   a  b  c
1  2  1  2
2  2  2  2
3  2 NA  2
4 NA  1 NA
5 NA  2  2
6 NA NA NA
7  1  1  1
8  1  2  2
9  1 NA NA

我希望 c 为 (2,2,2,NA,2,NA,1,2,1),但实际输出为 (2,2,2,NA,2,NA,1,2,NA) . 为什么最后一个单元格更改为 NA(应该是 1)?

标签: rdplyr

解决方案


这似乎是一个好地方case_when,它评估每个案例,直到找到一个TRUE。如果您希望第 8 行为 2,听起来这两个条件应该交换。

library(dplyr)
abc <- ab %>%
  mutate(c = case_when(a == 2 | b == 2 ~ 2,
                       a == 1          ~ 1,
                       TRUE            ~ NA_real_))

#> abc
#   a  b  c
#1  2  1  2
#2  2  2  2
#3  2 NA  2
#4 NA  1 NA
#5 NA  2  2
#6 NA NA NA
#7  1  1  1
#8  1  2  2
#9  1 NA  1

推荐阅读