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

使用dplyr筛选含冒号的单元格并构建新数据框的问题

问题分析与解决方案

错误原因

你当前代码的问题出在两个核心点:

  1. contains(":")是筛选列名包含冒号的列,但你的数据列名都是column_a这类不带冒号的,所以这个筛选不会选中任何列,最后只剩分组用的index列。
  2. group_by(index)完全多余,你的需求是逐行提取符合条件的值,不需要分组聚合操作。

正确解法

以下是两种基于tidyverse的实现方式,都能得到你想要的结果:

方法一:逐行提取带冒号的值

利用rowwise()逐行处理,结合str_subset提取符合条件的元素:

library(tidyverse)

# 构造示例数据(如果已有DF可跳过这步)
DF <- tibble(
  column_a = c("346:3", "BGH", "UBDI", "BHJD"),
  column_b = c("BHJK", "784:2", "SDR", "BJS"),
  column_c = c(NA, NA, NA, "256:1"),
  index = 1:4
)

DF_new <- DF %>%
  rowwise() %>%
  # 提取当前行除index外所有列中带冒号的值
  mutate(value = str_subset(c_across(-index), ":", simplify = TRUE)) %>%
  # 没有符合条件的值时设为NA
  mutate(value = if (length(value) == 0) NA else value) %>%
  ungroup() %>%
  select(index, value)

方法二:利用条件筛选合并值

通过if_any检查每行是否有带冒号的列,再用coalesce提取对应值:

DF_new <- DF %>%
  mutate(
    # 找到每行中带冒号的列并提取值,无符合项则返回NA
    value = coalesce(
      if_any(-index, ~str_detect(., ":"), .fns = ~.),
      NA_character_
    )
  ) %>%
  select(index, value)

运行后得到的DF_new格式如下:

# A tibble: 4 × 2
  index value 
  <int> <chr> 
1     1 346:3 
2     2 784:2 
3     3 NA    
4     4 256:1 

内容的提问来源于stack exchange,提问作者Mulligan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:03:29