use*_*648 24 r dplyr data-cleaning
我试图在dplyr::case_when内部dplyr::mutate创建一个新变量,我将一些值设置为缺失并同时重新编码其他值.
但是,如果我尝试将值设置为NA,则会收到错误消息,指出我们无法创建变量,new因为NAs是合乎逻辑的:
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)
Run Code Online (Sandbox Code Playgroud)
Sca*_*bee 39
如上所述?case_when:
所有RHS必须评估相同类型的载体.
你实际上有两种可能性:
1)创建new数字向量
df <- df %>% mutate(new = case_when(old == 1 ~ 5,
old == 2 ~ NA_real_,
TRUE ~ as.numeric(old)))
Run Code Online (Sandbox Code Playgroud)
请注意,这NA_real_是数字版本NA,并且您必须转换old为数字,因为您在原始数据框中将其创建为整数.
你得到:
str(df)
# 'data.frame': 3 obs. of 2 variables:
# $ old: int 1 2 3
# $ new: num 5 NA 3
Run Code Online (Sandbox Code Playgroud)
2)创建new整数向量
df <- df %>% mutate(new = case_when(old == 1 ~ 5L,
old == 2 ~ NA_integer_,
TRUE ~ old))
Run Code Online (Sandbox Code Playgroud)
这里,5Lforce 5进入整数类型,并且NA_integer_是整数版本NA.
所以这个时间new是整数:
str(df)
# 'data.frame': 3 obs. of 2 variables:
# $ old: int 1 2 3
# $ new: int 5 NA 3
Run Code Online (Sandbox Code Playgroud)
尝试这个 ?
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
Run Code Online (Sandbox Code Playgroud)