我尝试在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)
答案 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)