避免与dplyr::case_发生类型冲突

避免与dplyr::case_发生类型冲突,r,dplyr,data-cleaning,R,Dplyr,Data Cleaning,我试图在dplyr::mutate中使用dplyr::case\u创建一个新变量,在该变量中,我将一些值设置为missing,并同时对其他值重新编码 但是,如果我尝试将值设置为NA,我会收到一个错误,说明我们无法创建变量new,因为NAs是逻辑的: 突变(数据,点)时出错: 计算错误:必须是双精度类型,而不是逻辑类型 是否有一种方法可以使用此函数在数据帧中的非逻辑向量中将值设置为NA library(dplyr) # Create data df <- data.frame(ol

我试图在
dplyr::mutate
中使用
dplyr::case\u创建一个新变量,在该变量中,我将一些值设置为missing,并同时对其他值重新编码

但是,如果我尝试将值设置为
NA
,我会收到一个错误,说明我们无法创建变量
new
,因为
NA
s是逻辑的:

突变(数据,点)时出错:
计算错误:必须是双精度类型,而不是逻辑类型

是否有一种方法可以使用此函数在数据帧中的非逻辑向量中将值设置为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)
库(dplyr)
#创建数据
试试这个

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

案例中所述,当
时:

所有RHS必须计算为相同类型的向量

实际上有两种可能性:

1)创建
new
作为数字向量

df <- df %>% mutate(new = case_when(old == 1 ~ 5,
                                    old == 2 ~ NA_real_,
                                    TRUE ~ as.numeric(old)))
df <- df %>% mutate(new = case_when(old == 1 ~ 5L,
                                    old == 2 ~ NA_integer_,
                                    TRUE ~ old))
2)创建
new
作为整数向量

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

对于
NA
的情况,您也可以使用
as.numeric(NA)
as.integer(NA)
,因为
NA_real_
NA_integer_
有点烦人,在这种情况下很少使用。很好。另外,要显示:idential(NA_real_,as.numeric(NA))生成TRUE。@hadley这个答案现在对我来说很清楚,但我花了一段时间才弄清楚。如果在tidyverse
案例中有这样一个例子,那将非常有帮助。在我的例子中,当缺少分组数据的所有值时,mean(x[1:2],na.rm=T)生成一个NaN结果。“把那些案子重新编码成NA_real____________________________________。Hadley不会被ping,有关通知如何工作的更多详细信息,请参阅。然而,本PR上周澄清了文档:在类
Date
的列中插入
NA
占位符时,使用
as.Date(NA)
生成
NA