避免与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