在R中实现基于特定行均值建列及高频基因tail_len均值计算
R语言处理基因数据的两个需求解决方案
首先构建示例数据框:
df <- data.frame( gene = c("SPAC20G4.06c", "SPCC613.06", "SPAC6F6.03c", "SPAC20G4.06c", "SPBC23G7.15c", "SPAC589.10c", "SPBC23G7.15c", "SPAC22H12.04c", "SPAC22H12.04c", "SPAC6G10.11c", "SPAC589.10c", "SPBC18E5.06"), tail_len = c(3, 5, 2, 3, 5, 2, 3, 1, 12, 8, 31, 16) )
需求1:统计频次最高的前10个基因并计算对应tail_len均值
使用dplyr包实现(简洁直观)
library(dplyr) top10_gene_stats <- df %>% group_by(gene) %>% summarise(出现频次 = n(), tail_len均值 = mean(tail_len)) %>% arrange(desc(出现频次)) %>% slice_head(n = 10) print(top10_gene_stats)
使用base R实现(无需额外包)
# 统计基因出现频次 gene_counts <- table(df$gene) # 筛选频次最高的前10个基因(若基因总数不足10则取全部) top10_genes <- names(sort(gene_counts, decreasing = TRUE))[1:min(10, length(gene_counts))] # 计算这些基因的tail_len均值 top10_mean <- tapply(df$tail_len[df$gene %in% top10_genes], df$gene[df$gene %in% top10_genes], mean) # 整理结果为数据框 top10_gene_stats_base <- data.frame( gene = names(top10_mean), 出现频次 = gene_counts[names(top10_mean)], tail_len均值 = top10_mean ) print(top10_gene_stats_base)
需求2:基于特定行的数值均值创建新列
以下两种常见场景供参考:
场景1:基于固定行号的均值创建全局新列
例如计算第1、3、5、7行的tail_len均值,将该值作为新列填充到所有行:
# 指定目标行号 target_rows <- c(1, 3, 5, 7) # 计算指定行的均值 row_mean <- mean(df$tail_len[target_rows]) # 新增列 df$指定行tail_len均值 <- row_mean print(df)
场景2:基于分组内特定行的均值创建分组新列
例如每个基因组内,取tail_len最小的2行的均值,作为该组所有行的新列值:
library(dplyr) df <- df %>% group_by(gene) %>% mutate(组内最小2行tail_len均值 = mean(tail_len[order(tail_len)][1:min(2, n())])) %>% ungroup() print(df)
内容的提问来源于stack exchange,提问作者bobyca
相关产品推荐
相关产品推荐

