如何检查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
相关产品推荐
相关产品推荐

