如何将数据框中3倍标准差外的异常值提取至独立data frame?
提取偏离均值3倍标准差的异常值行/列信息
可以通过转换数据格式+分组计算阈值+筛选的方式实现,不需要修改原来的替换NA代码,直接从原始数据tpose_genexp提取即可,具体方案如下:
代码实现
library(tidyverse) # 1. 将宽格式数据转为长格式,保留行名为Sample列 long_data <- tpose_genexp %>% rownames_to_column(var = "Sample") %>% pivot_longer(cols = contains("G"), names_to = "Gene", values_to = "Expression") # 2. 按Gene分组,计算每个基因的均值、3倍标准差阈值,筛选异常值 outliers_df <- long_data %>% group_by(Gene) %>% mutate( col_mean = mean(Expression, na.rm = TRUE), col_sd = sd(Expression, na.rm = TRUE), is_outlier = abs(Expression - col_mean) > 3 * col_sd ) %>% filter(is_outlier) %>% ungroup() %>% select(Sample, Gene) # 保留需要的两列
代码说明
rownames_to_column:把原数据的行名(Sample)转为显式列,方便后续提取。pivot_longer:将所有以"G"开头的列(基因列)转为长格式,每一行对应一个Sample-Gene的表达值。group_by(Gene):按基因分组,确保每个基因都用自己列的均值和标准差计算阈值。abs(Expression - col_mean) > 3 * col_sd:判断当前表达值是否偏离均值超过3倍标准差。- 最后筛选出异常值行,只保留
Sample和Gene列,就得到你需要的格式。
补充说明
如果你的原始数据里已经有NA值,记得在计算mean和sd时加上na.rm = TRUE,避免计算出错。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

