R语言如何按字符串ID对应值对逗号分隔字符串序列求和
R语言实现多字符串匹配得分求和方案
实现思路
- 第一步:将
df每行的patterns字段按,(逗号加空格)分割为单个字符串向量 - 第二步:对每个分割得到的字符串,匹配
df2中对应的scores值 - 第三步:将每行匹配到的所有得分求和,合并回原数据框
注意:如果存在patterns中包含df2无记录的字符串,可在sum函数中添加na.rm = TRUE参数忽略缺失值,避免结果返回NA
解决方案
方案1:tidyverse 实现(可读性高,适合处理复杂扩展需求)
library(tidyverse) # 构造示例数据 df <- data.frame(patterns = c("CCDC127, HSF1, NDUFB9", "CCDC127, EXOC3, YIF1A", "EXOC3, NDUFB9, YIF1A")) df2 <- data.frame(strings = c("CCDC127", "HSF1", "NDUFB9", "EXOC3", "YIF1A"), scores = c(10, 11, 12, 13, 14)) # 计算得分总和 result <- df %>% rowwise() %>% mutate( sum = sum(df2$scores[match(str_split_1(patterns, ", "), df2$strings)]) ) %>% ungroup()
方案2:base R 实现(无需加载第三方包,运行速度快)
# 构造示例数据 df <- data.frame(patterns = c("CCDC127, HSF1, NDUFB9", "CCDC127, EXOC3, YIF1A", "EXOC3, NDUFB9, YIF1A")) df2 <- data.frame(strings = c("CCDC127", "HSF1", "NDUFB9", "EXOC3", "YIF1A"), scores = c(10, 11, 12, 13, 14)) # 构建命名字典快速匹配得分 score_dict <- setNames(df2$scores, df2$strings) # 逐行拆分字符串并求和 df$sum <- sapply(strsplit(df$patterns, ", "), function(x) sum(score_dict[x]))
两种方案运行后得到的结果均与预期输出一致。
内容的提问来源于stack exchange,提问作者Olha Kholod
相关产品推荐
相关产品推荐

