如何在R中按Protein分组统计Peptide唯一值数量并新增列?
解决按Protein分组统计唯一Peptide数量的问题
方法一:用dplyr包(推荐,语法清晰)
先加载dplyr包,按Protein分组后计算每组内的唯一Peptides数量,新增列到原数据框:
library(dplyr) # 注意:原数据框的肽段列名是Peptides,和你预期输出里的Peptide是笔误,这里以原数据框列名为准 df <- df %>% group_by(Protein) %>% mutate(`Unique values` = n_distinct(Peptides)) %>% ungroup()
group_by(Protein):按Protein字段分组n_distinct(Peptides):统计每组内不重复的Peptides数量mutate:把统计结果作为新列添加到每一行,保证同一Protein的所有行都对应相同的统计值ungroup():取消分组,还原普通数据框结构(可选,但能避免后续操作的分组干扰)
方法二:用Base R原生函数(无需额外包)
如果不想加载dplyr,用ave函数也能实现:
df$`Unique values` <- ave(df$Peptides, df$Protein, FUN = function(x) length(unique(x)))
ave函数会按第二个参数(df$Protein)分组,对第一个参数(df$Peptides)执行指定的统计函数function(x) length(unique(x)):计算每组内不重复值的数量,结果自动匹配到原数据的每一行
原代码的问题
你写的for循环没有做分组筛选,每次赋值都是整个Peptides列的全局唯一值数量,而非当前Protein分组内的数量,所以最终整列都是同一个全局统计值,达不到分组统计的效果。
内容的提问来源于stack exchange,提问作者Marie Gebelin
相关产品推荐
相关产品推荐

