使用dplyr筛选含冒号的单元格并构建新数据框的问题
问题分析与解决方案
错误原因
你当前代码的问题出在两个核心点:
contains(":")是筛选列名包含冒号的列,但你的数据列名都是column_a这类不带冒号的,所以这个筛选不会选中任何列,最后只剩分组用的index列。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
相关产品推荐
相关产品推荐

