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

如何检查df2各列值是否为df1列S的子串并按列求和

问题解决:DataFrame逐行列匹配子串并统计次数

需求:有两个行数相同的DataFrame(df1和df2),需要逐行检查df2中每一列的值是否作为子串包含在df1的S列对应行中,之后按列统计df2各列的匹配次数。

测试数据

df1 = read.table(text="R    S
    GG  AACCTT
    CC  AAGGTT
    CC  AAGGTT
    GG  AACCTT
    GG  AACCTT
    CC  AAGGTT
    GG  AACCTT
    GG  AACCTT
    GG  AACCTT
    TT  AACCGG
    AA  CCGGTT
    CC  AAGGTT
    TT  AACCGG
    AA  CCGGTT
    AA  CCGGTT", header=T, stringsAsFactors=F)

df2 = read.table(text="M1   M2  M3  M4  M5  M6  M7  M8
    GG  GG  GG  GG  GG  GG  GG  GG
    CC  CC  CC  CC  CC  CC  CC  CC
    CC  TT  TT  TT  TT  TT  TT  TT
    HH  TT  TT  TT  TT  HH  TT  TT
    GG  AA  GG  GG  GG  --  GG  HH
    CC  CC  CC  CC  CC  TT  CC  CC
    GG  GG  GG  GG  GG  --  GG  GG
    GG  GG  GG  GG  GG  --  GG  GG
    --  --  HH  AA  HH  AA  HH  AA
    TT  --  HH  CC  HH  CC  HH  CC
    AA  --  AA  AA  AA  --  AA  AA
    CC  CC  CC  CC  CC  CC  CC  CC
    --  HH  CC  CC  CC  HH  HH  CC
    AA  HH  GG  GG  GG  HH  HH  GG
    AA  HH  GG  GG  GG  HH  GG  GG", header=T, stringsAsFactors=F)

解决方案

1. 生成匹配逻辑矩阵

遍历df2的每一列,逐行检查当前列的值是否是df1$S对应行的子串,同时跳过特殊标记--(直接判定为不匹配):

match_matrix <- sapply(df2, function(col) {
  mapply(function(pattern, text) {
    if (pattern == "--") {
      FALSE
    } else {
      # 使用fixed=TRUE避免正则表达式解析,确保子串精确匹配
      grepl(pattern, text, fixed = TRUE)
    }
  }, col, df1$S)
})

生成的match_matrix就是需求中的中间逻辑结果,每行对应原数据的行,每列对应df2的列,值为TRUE表示匹配成功,FALSE表示匹配失败。

2. 按列统计匹配次数

使用colSums()对逻辑矩阵的每列求和,统计各列的匹配次数:

result <- colSums(match_matrix)
print(result)

最终输出

M1 M2 M3 M4 M5 M6 M7 M8 
 0  3  5  7  5  4  3  7 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:45:18