我试图在 dplyr::case_when
中使用 dplyr::mutate
来创建一个新变量,我将一些值设置为缺失并同时重新编码其他值。
但是,如果我尝试将值设置为 NA
,则会收到一条错误消息,指出我们无法创建变量 new
因为 NA
是合乎逻辑的:
Error in mutate_impl(.data, dots) :
Evaluation error: must be type double, not logical.
有没有办法使用它在数据帧的非逻辑向量中将值设置为
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)
最佳答案
如 ?case_when
所述:
All RHSs must evaluate to the same type of vector.
你实际上有两种可能性:
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
关于r - 避免与 dplyr::case_when 发生类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893933/