R语言添加列统计多列中指定开头子串的出现次数
问题解决:统计每行中指定前缀的元素数量
给定如下R数据框:
df <- data.frame( x = c("T302928", "C0293", "G402928", "T30294", "S40298"), y = c("B40292", "I980", "B40928", "C203948", "V308283"), z = c("C0255", "V302939", "N02938", "R09282", "B02938") )
需要新增一列count_all,统计每行各列中以T30、C02、V30开头的元素数量。你之前尝试的代码只能做完全匹配,无法实现前缀匹配:
df$count_all <- apply(df, 1, function(x) length(which(x %in% c("T03", "C02", "V30"))))
解决方案1:基础R实现(grepl+apply)
用正则表达式的^符号匹配字符串开头,将三个前缀合并为一个匹配模式,逐行统计符合条件的元素数量:
# 定义前缀匹配的正则模式 prefix_pattern <- "^T30|^C02|^V30" # 逐行计算匹配数量 df$count_all <- apply(df, 1, function(row) { sum(grepl(prefix_pattern, row)) })
运行后得到目标结果:
> df x y z count_all 1 T302928 B40292 C0255 2 2 C0293 I980 V302939 2 3 G402928 B40928 N02938 0 4 T30294 C203948 R09282 1 5 S40298 V308283 B02938 1
解决方案2:tidyverse风格实现
如果你习惯使用dplyr和stringr,可以用逐行处理的方式实现:
library(dplyr) library(stringr) # 定义需要匹配的前缀向量 target_prefixes <- c("T30", "C02", "V30") df <- df %>% rowwise() %>% mutate( count_all = sum(str_starts(c_across(everything()), target_prefixes)) ) %>% ungroup()
原代码失效原因
你之前用的x %in% ...是完全匹配逻辑,只有当元素和列表中的字符串完全一致时才会被计数,而我们需要的是前缀匹配,必须用正则表达式或专门的前缀判断函数来实现。
内容的提问来源于stack exchange,提问作者lemnbalm
相关产品推荐
相关产品推荐

