如何在mutate中对向量列执行逐行条件判断?
逐行检查元素是否存在于对应行的列表中
问题说明
你当前的代码中,ifelse(value %in% unlist(list.value))会将list.value列的所有元素合并成一个向量后做判断,导致所有行的test结果都是"YES",但实际需求是逐行验证每行的value是否存在于对应行的list.value向量里。
解决方案
方法1:使用dplyr的行处理模式
library(dplyr) # 构造数据(用tibble更适合存储列表列,避免as.data.frame的类型转换问题) value <- c("A","B","C") list.value <- list(c("A","B"),c("A","C"),c("C","B")) data <- tibble(value, list.value) # 逐行判断 data %>% rowwise() %>% mutate(test = ifelse(any(value == list.value), "YES", "NO")) %>% ungroup()
rowwise()会让后续的mutate按行执行,any(value == list.value)直接判断当前行的value是否匹配该行list.value中的任意元素。
方法2:使用purrr的逐行映射
library(dplyr) library(purrr) data %>% mutate(test = map2_chr(value, list.value, ~ifelse(.x %in% .y, "YES", "NO")))
map2_chr()会将value和list.value逐行配对,.x代表每行的value,.y代表对应行的list.value,最终返回字符型的结果列。
方法3:基R实现(无需加载额外包)
value <- c("A","B","C") list.value <- list(c("A","B"),c("A","C"),c("C","B")) data <- data.frame(value, list.value, stringsAsFactors = FALSE) # 用mapply逐行调用判断函数 data$test <- mapply(function(v, lv) ifelse(v %in% lv, "YES", "NO"), data$value, data$list.value)
mapply()实现了逐行配对传入参数,逻辑和tidyverse方法一致,适合不想加载包的场景。
内容的提问来源于stack exchange,提问作者Mimosa
相关产品推荐
相关产品推荐

