如何判断tibble中B列年份是否在A列的年份范围/单值字符串中?
解决混合年份范围/单值的存在性判断问题
针对你给出的tibble数据,要判断B列年份是否存在于A列的年份集合中,可通过解析A列字符串生成完整年份列表后进行判断,代码如下:
library(tidyverse) # 测试数据,包含多种A列格式 test <- tibble(A = c("1994:2020, 2021", "1994:2012, 2014, 2016:2020, 2021"), B = c(1995, 2015)) # 生成判断结果 test <- test %>% mutate(InA = map2_lgl(A, B, function(a_str, b_year) { # 拆分A列字符串为独立的年份/范围项 parts <- str_split(a_str, ", ")[[1]] # 解析每个项为对应的年份集合 all_years <- map(parts, function(part) { if (str_detect(part, ":")) { # 处理年份范围,生成连续年份序列 range_vals <- as.integer(str_split(part, ":")[[1]]) seq(range_vals[1], range_vals[2]) } else { # 处理单个年份 as.integer(part) } }) %>% unlist() # 判断B列年份是否在集合中 b_year %in% all_years }) %>% ifelse(., "Yes", "No")) # 查看结果 test
运行后输出:
# A tibble: 2 × 3 A B InA <chr> <dbl> <chr> 1 1994:2020, 2021 1995 Yes 2 1994:2012, 2014, 2016:2020, 2021 2015 No
关键步骤说明
- 使用
map2_lgl逐行配对处理A列字符串和B列年份,确保每一行的判断对应正确 - 通过
str_split拆分A列的年份项,兼容多范围、多单值的混合格式 - 对每个年份项做分支处理:含冒号的范围生成连续年份序列,单值直接转整数
- 合并所有年份后用
%in%完成存在性判断,最后转成"Yes/No"格式
原代码问题说明
你之前的代码ifelse(B %in% A, "Yes", "No")逻辑错误:B %in% A是将B的数值与A列的完整字符串做匹配,而非解析字符串中的年份集合,因此必然返回"No"。
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

