使用dplyr按行计算几何均值(geomean)的技术问询
按行计算数据框指定列的几何均值
需要基于数据框中的twodct_ATP5B、twodct_EIF4A2、twodct_GAPDH三列,逐行计算几何均值。以下是示例数据:
data <- structure(list(fs_id = structure(1:8, levels = c("CON1", "NC", "water", "SCR1", "FAN1_1", "CON2", "SCR2", "FAN1_2"), class = "factor"), twodct_ATP5B = c(1.06960527260684, 0.00241424406360917, NA, 0.953100847649869, 0.404512354245938, 0.934924336678708, 1.32283164360403, 0.194667767059346), twodct_EIF4A2 = c(1.07741209897215, NA, NA, 1.01873805854745, 0.467988708062081, 0.928149963188649, 1.31762036152893, 0.33377442013251), twodct_GAPDH = c(1.04388739915294, 0.000156497290441042, NA, 0.972431569982792, 0.547030142788418, 0.957957726869246, 0.942311505534324, 0.337842927620691)), row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"))
数据预览:
> data # A tibble: 8 × 4 fs_id twodct_ATP5B twodct_EIF4A2 twodct_GAPDH <fct> <dbl> <dbl> <dbl> 1 CON1 1.07 1.08 1.04 2 NC 0.00241 NA 0.000156 3 water NA NA NA 4 SCR1 0.953 1.02 0.972 5 FAN1_1 0.405 0.468 0.547 6 CON2 0.935 0.928 0.958 7 SCR2 1.32 1.32 0.942 8 FAN1_2 0.195 0.334 0.338
尝试的代码无法运行,原因是在rowwise()环境下使用select()返回的是数据框,log()无法直接处理数据框结构。以下是两种可行的解决方案:
方法一:使用c_across()逐行提取列值
c_across()在rowwise()环境中可以将指定列转换为向量,配合log()和mean()完成计算,同时加入na.rm = TRUE处理缺失值:
data %>% rowwise() %>% mutate(geomean = exp(mean(log(c_across(c(twodct_ATP5B, twodct_EIF4A2, twodct_GAPDH))), na.rm = TRUE))) %>% ungroup()
方法二:使用rowMeans()高效计算
无需rowwise(),直接用rowMeans()按行计算对数后的均值,再取指数,这种方法性能更优:
data %>% mutate(geomean = exp(rowMeans(log(select(., twodct_ATP5B, twodct_EIF4A2, twodct_GAPDH)), na.rm = TRUE)))
注意事项
- 必须确保计算列中的值均为正数,否则
log()会报错; na.rm = TRUE会忽略缺失值,若需要保留NA(即只要行中有NA就返回NA),可移除该参数。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

