r - 避免与 dplyr::case_when 发生类型冲突

标签 r dplyr data-cleaning

我试图在 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/

相关文章:

r - 给定条件并行或顺序执行 foreach 循环

r - 使用 rle 消除第一个和最后一个序列

r - dplyr 式的方式来执行分组和未分组的汇总操作

python - 匹配两个 Pandas 系列: How to find a string element from one series in another series and then create a new column

r - 在 mutate (dplyr) 中粘贴变量名称

r - 为Ax = b并行求解Solve()吗?

r - dplyr - 在 group_by 后右加入没有产生所需/预期的结果

r - 当有多个数据点时复制信息

r - 基于引用文件清理数据集

r - 遍历文件夹层次结构