避免与dplyr :: case_when的类型冲突

use*_*648 24 r dplyr data-cleaning

我试图在dplyr::case_when内部dplyr::mutate创建一个新变量,我将一些值设置为缺失并同时重新编码其他值.

但是,如果我尝试将值设置为NA,则会收到错误消息,指出我们无法创建变量,new因为NAs是合乎逻辑的:

mutate_impl(.data,dots)
出错:评估错误:必须是double类型,不是逻辑.

有没有办法NA使用此方法在数据框中的非逻辑向量中设置值?

library(dplyr)    

# Create data
df <- data.frame(old = 1:3)

# Create new variable
df <- df %>% dplyr::mutate(new = dplyr::case_when(old == 1 ~ 5,
                                                  old == 2 ~ NA,
                                                  TRUE ~ old))

# Desired output
c(5, NA, 3)
Run Code Online (Sandbox Code Playgroud)

Sca*_*bee 39

如上所述?case_when:

所有RHS必须评估相同类型的载体.

你实际上有两种可能性:

1)创建new数字向量

df <- df %>% mutate(new = case_when(old == 1 ~ 5,
                                    old == 2 ~ NA_real_,
                                    TRUE ~ as.numeric(old)))
Run Code Online (Sandbox Code Playgroud)

请注意,这NA_real_是数字版本NA,并且您必须转换old为数字,因为您在原始数据框中将其创建为整数.

你得到:

str(df)
# 'data.frame': 3 obs. of  2 variables:
# $ old: int  1 2 3
# $ new: num  5 NA 3
Run Code Online (Sandbox Code Playgroud)

2)创建new整数向量

df <- df %>% mutate(new = case_when(old == 1 ~ 5L,
                                    old == 2 ~ NA_integer_,
                                    TRUE ~ old))
Run Code Online (Sandbox Code Playgroud)

这里,5Lforce 5进入整数类型,并且NA_integer_是整数版本NA.

所以这个时间new是整数:

str(df)
# 'data.frame': 3 obs. of  2 variables:
# $ old: int  1 2 3
# $ new: int  5 NA 3
Run Code Online (Sandbox Code Playgroud)

  • 您还可以为`NA`情况执行`as.numeric(NA)`或`as.integer(NA)`,因为`NA_real_`和`NA_integer_`有点令人讨厌,很少在这样的事情之外使用. (6认同)
  • 将“ NA”占位符插入到“日期”类的列中时,请使用“ as.Date(NA)”生成“ NA” (4认同)

WeN*_*Ben 5

尝试这个 ?

df %>% dplyr::mutate(new = dplyr::case_when(.$old == 1 ~ 5,
                                                  .$old == 2 ~ NA_real_,
                                                  TRUE~.$old))

> df
  old new
1   1   5
2   2  NA
3   3   3
Run Code Online (Sandbox Code Playgroud)