R语言dataframe按列前缀分组按行求均值的sapply简便方法咨询
实现方法
用sapply批量处理完全可以实现,具体代码如下:
# 1. 提取所有样本列的分组前缀(去掉列名中.及之后的后缀,去重得到所有分组) groups <- unique(sub("\\..*", "", names(df)[names(df) != "Gene"])) # 2. sapply遍历所有分组,批量计算每行均值,合并为结果数据框 mean_df <- data.frame( Gene = df$Gene, sapply(groups, function(cur_group) { # 匹配当前分组对应的所有列 cols <- df[, startsWith(names(df), paste0(cur_group, "."))] # 按行求均值 apply(cols, 1, mean) }) )
运行后输出的mean_df就是你需要的结果:
> mean_df Gene A1 A2 B1 B2 1 1 1.0 2.0 1.5 1.5 2 2 1.5 1.5 2.0 2.0 3 3 2.5 3.5 3.0 4.0 4 4 4.0 4.0 5.0 5.0 5 5 4.0 5.0 5.0 4.5 6 6 5.5 6.0 5.0 3.5
代码逻辑说明
- 先用
sub函数处理列名,把.1/.2这类后缀删掉,去重后得到所有分组名A1/A2/B1/B2 sapply遍历每个分组名,用startsWith匹配出对应分组的所有列,再用apply按行计算均值,最终返回的矩阵会自动绑定为数据框的列,列名和分组名完全对应。
如果处理的数据量较大,也可以用rowMeans替代apply提升运行效率,把apply(cols, 1, mean)替换成rowMeans(cols)即可。
内容的提问来源于stack exchange,提问作者Dswede43
相关产品推荐
相关产品推荐

