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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:27:36