尝试根据if_else条件更改变量值时出现 mutate() 的 dplyr 错误

dplyr error with mutate() when attempting to change variable value based on if_else condition

提问人:Sam 提问时间:3/8/2020 更新时间:3/8/2020 访问量:123

问:

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

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

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

R DPLYR的

评论


答:

2赞 akrun 3/8/2020 #1

问题出在 中的参数顺序上。如果我们使用 ,它将返回其长度为 2 的长度。相反,它应该是另一种方式,即 e..g%in%id_listid_list %in% IDID %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

注意:是,所以它需要转换为或添加为另一个级别(如果我们想坚持类)certaintyfactorcharacterlikelyfactor


它也可以保留为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

评论

0赞 Sam 3/8/2020
如此简单的解决方案。在我的真实数据集中,已经定义了多个级别。有没有办法将值更改为现有级别而不必转换为?certaintylikelycharacter
1赞 akrun 3/8/2020
@Sam 添加了另一个选项