如何在R语言数据框中新增列,标记指定列值是否存在于外部向量
问题:在R语言DataFrame中新增条件判断列in_vector
需求说明:
- 给DataFrame新增一列
in_vector - 判断规则:当某一行中任意一个以SR开头的列的值存在于外部向量
vector(值为'a','f','m')中时,标记为'Yes',否则为NA
示例数据
vector <- c('a', 'f', 'm') df <- data.frame( COL1 = c(12,76,90,40,34), SR3 = c('y','e','a','z','u'), SR_op = c('f','r','b','f','v'), letter = c('ab','cd','jk','fg','xy'), SR_2 = c('m','t','c','4','w'), stringsAsFactors = FALSE )
尝试过的代码
library(dplyr) df %>% mutate(across(.cols= starts_with('SR'), ~ case_when(. %in% vector ~ 'Yes')))
这段代码的问题是会逐个修改SR开头的列,而非新增一个汇总判断的目标列。
正确解决方案
方法1:使用if_any(推荐,需dplyr 1.0.0及以上版本)
利用if_any直接对行内所有SR开头的列做匹配判断,简洁高效:
library(dplyr) df %>% mutate(in_vector = case_when( if_any(starts_with('SR'), ~ .x %in% vector) ~ 'Yes', TRUE ~ NA_character_ ))
方法2:使用rowwise + any(兼容低版本dplyr)
通过行分组后,用any判断行内是否存在符合条件的值:
library(dplyr) df %>% rowwise() %>% mutate(in_vector = case_when( any(c_across(starts_with('SR')) %in% vector) ~ 'Yes', TRUE ~ NA_character_ )) %>% ungroup()
最终输出
COL1 SR3 SR_op letter SR_2 in_vector 1 12 y f ab m Yes 2 76 e r cd t <NA> 3 90 a b jk c Yes 4 40 z f fg 4 Yes 5 34 u v xy w <NA>
内容的提问来源于stack exchange,提问作者user21508369
相关产品推荐
相关产品推荐

