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

时间:2017-07-03 21:14:03

标签: r dplyr data-cleaning

我尝试在dplyr::case_when中使用dplyr::mutate创建一个新变量,我将某些值设置为缺失并同时重新编码其他值。

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

  

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)

3 个答案:

答案 0 :(得分:32)

?case_when中所述:

  

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

你实际上有两种可能性:

1)创建new作为数字向量

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

请注意,NA_real_NA的数字版本,您必须将old转换为数字,因为您在原始数据框中将其创建为整数。

你得到:

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

2)将new创建为整数向量

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

此处,5L强制5为整数类型,NA_integer_NA的整数版本。

所以这次new是整数:

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

答案 1 :(得分:2)

试试这个?

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

答案 2 :(得分:0)

seasmith comments一样,使用as.Date(NA)为日期列生成NA