首页 > 解决方案 > 尝试根据 if_else 条件更改变量值时 mutate() 出现 dplyr 错误

问题描述

我正在尝试使用dplyr::mutate(). 如果在数据集中的 ID 列中找到来自字符向量的 ID,我想将“确定性”列的值从“不确定”更改为“可能”。如果不匹配,我想保留原始值。这是我当前尝试的代表:

library(dplyr)
library(magrittr)

data <- data.frame(
  ID = c("a100", "b100", "c100", "d100", "e100", "f100"),
  certainty = c("confirmed", "likely", "unsure", "likely", "unsure", "confirmed")
)

data %<>% as_tibble()

id_list <- c("c100", "e100")

data %<>%
  mutate(certainty = if_else(id_list %in% ID, "likely", certainty))

输出应如下所示:

 ID    certainty
  <fct> <fct>    
1 a100  confirmed
2 b100  likely   
3 c100  likely   
4 d100  likely   
5 e100  likely   
6 f100  confirmed

目前我收到此错误:

Error: `false` must be length 2 (length of `condition`) or one, not 6

我应该如何解决这个问题?

标签: rdplyr

解决方案


问题在于%in%. id_list如果我们使用,它会返回长度为 2 的值id_list %in% ID。相反,它应该是另一种方式,即ID %in% id_list例如

1:3 %in% 1:2
#[1]  TRUE  TRUE FALSE

1:2 %in% 1:3
#[1] TRUE TRUE

在这里,应该是

library(dplyr)
data %>% 
      mutate(certainty = ifelse(ID %in% id_list, "likely", as.character(certainty)))

# A tibble: 6 x 2
#  ID    certainty
#  <fct> <chr>    
#1 a100  confirmed
#2 b100  likely   
#3 c100  likely   
#4 d100  likely   
#5 e100  likely   
#6 f100  confirmed

注意:certaintyis factor,因此需要将其转换为character或添加likely为另一个级别(如果我们想坚持factor上课)


它也可以保留为factor

library(forcats)
data %>%
     mutate(certainty = fct_collapse(certainty,
              likely = as.character(certainty)[ID %in% id_list]))\
# A tibble: 6 x 2
#  ID    certainty
#  <fct> <fct>    
#1 a100  confirmed
#2 b100  likely   
#3 c100  likely   
#4 d100  likely   
#5 e100  likely   
#6 f100  confirmed

推荐阅读