【问题标题】:calculate z-score across multiple dataframes in R计算 R 中多个数据帧的 z 分数
【发布时间】:2020-08-05 22:29:47
【问题描述】:

我有十个行数和列数相等的数据框。它们看起来像这样:

df1 <- data.frame(geneID=c("AKT1","AKT2","AKT3","ALK",
                           "APC"),
                  CDKN2A=c(3490,9447,4368,908,204),
                  INPP4B=c(NA,9459,4395,1030,NA),
                  BCL2=c(NA,9480,4441,1209,NA),
                  IRS2=c(NA,NA,4639,1807,NA),
                  HRAS=c(3887,9600,4691,1936,1723))

df2 <- data.frame(geneID=c("AKT1","AKT2","AKT3","ALK",
                           "APC"),
                  CDKN2A=c(10892,17829,7156,1325,387),
                  INPP4B=c(NA,17840,7185,1474,NA),
                  BCL2=c(NA,17845,7196,1526,NA),
                  IRS2=c(NA,NA,12426,10244,NA),
                  HRAS=c(11152,17988,7545,2734,2423))

df3 <- data.frame(geneID=c("AKT1","AKT2","AKT3","ALK",
                           "APC"),
                  CDKN2A=c(11376,17103,8580,780,178),
                  INPP4B=c(NA,17318,9001,2829,NA),
                  BCL2=c(NA,17124,8621,1141,NA),
                  IRS2=c(NA,NA,8658,1397,NA),
                  HRAS=c(11454,17155,8683,1545,1345))

我想根据多个数据帧的均值和方差计算每个数据帧的 z 分数。 z-score 的计算公式如下:z-score=(x-mean(x))/sd(x)))。

我发现 plyr 的 ddply 函数可以完成这项工作,但解决方案是针对单个数据帧,而我有多个数据帧作为单独的文件,有 18214 行和 269 列。

如果有任何建议,我将不胜感激。

非常感谢您的帮助! 奥尔哈

【问题讨论】:

  • 你想要每个data.frame中每一列的z分数吗(基因ID除外)?我不确定这个示例输入的期望输出是什么。
  • 你玩过Mapmapply吗?
  • 我想为数据框中的每个单元格/交叉点获得 z 分数

标签: r dataframe statistics


【解决方案1】:

这是一种选择,我们将数据集与bind_rows(来自dplyr)绑定在一起,然后按分组列分组并返回zscore转换后的数字列

library(dplyr)
bind_rows(df1, df2, df3, .id = 'grp') %>% 
     group_by(geneID) %>% 
     mutate(across(where(is.numeric), 
      ~(.- mean(., na.rm = TRUE))/sd(., na.rm = TRUE), .names = '{col}_zscore'))

注意:如果我们不需要新列,则删除 .names 部分


如果我们需要在循环中执行此操作,而不绑定到单个 data.frame,可以循环 list

library(purrr)
list(df1, df2, df3) %>% # // automatically => mget(ls('^df\\d+$'))
        map(~ .x %>%
          mutate(across(where(is.numeric), 
      ~(.- mean(., na.rm = TRUE))/sd(., na.rm = TRUE), .names = '{col}_zscore')))

【讨论】:

    【解决方案2】:

    这是一个带有函数scale 的基本 R 解决方案。

    df_list <- list(df1, df2, df3)
    
    df_list2 <- lapply(df_list, function(DF){
      i <- sapply(DF, is.numeric)
      DF[i] <- lapply(DF[i], scale)
      DF
    })
    

    S3 方法

    考虑到scale 是通用的并且可以为它编写方法,这里有一个data.frame 方法,然后应用到同一个列表df_list

    scale.data.frame <- function(x, center = TRUE, scale = TRUE){
      i <- sapply(x, is.numeric)
      x[i] <- lapply(x[i], scale, center = center, scale = scale)
      x
    }
    
    df_list3 <- lapply(df_list, scale)
    
    identical(df_list2, df_list3)
    #[1] TRUE
    

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 1970-01-01
      • 2019-07-03
      • 2017-05-28
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多