You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:35:12