有没有办法计算数据框中一行中所有值的 Z 分数?

Is there a way to calculate the Z score for all values in a row in a data frame?

我有一个数据框,其中包含一个基因在 1677 种条件下的表达水平。我希望创建一个新的数据框,其中每个条件都有 Z 分数。这是我到目前为止的代码:

for (cell_no in 1:ncol(NANOG_data)) {
  z_score[cell_no] <- (NANOG_data[2, cell_no] - rowMeans(NANOG_data)) / rowSds(as.matrix(NANOG_data))}

And this is what the data frame looks like.

当我运行这段代码时,我得到这个错误:

错误:找不到对象 'z_score'。

有没有一种方法可以更轻松地使用 for 循环填充新数据框,或者是否有一个矢量化函数我可以 运行 在我的原始数据框上计算每个值的 Z 分数?

正如@GuedesBF 评论的那样,发布数据的屏幕截图是不好的做法,您应该避免这种做法(参考 https://xkcd.com/2116/)。

我会尝试用虚拟数据集帮助您:

#let's first generate a matrix
set.seed(999)
my_dummy_data <- matrix(rnorm(length(letters)), nrow=1, dimnames=list(1,letters))

>my_dummy_data 
           a        b        c         d          e          f         g
1 -0.2817402 -1.31256 0.795184 0.2700705 -0.2773064 -0.5660237 -1.878658
          h          i         j        k         l         m         n
1 -1.266791 -0.9677497 -1.121009 1.325464 0.1339774 0.9387494 0.1725381
          o         p          q         r         s         t         u
1 0.9576504 -1.362686 0.06833513 0.1006576 0.9013448 -2.074357 -1.228563
          v          w         x         y         z
1 0.6430443 -0.3597629 0.2940356 -1.125268 0.6422657

据我了解,这与您的数据结构相同:列名是基因(例如“AAACCCTG...”),数值是“表达式”。 (不是遗传学家,如果我用错了术语,我深表歉意:))。

现在,我假设您想生成一个新向量,其中通过减去平均值并除以标准误差将表达式值转换为 z 分数。可以通过以下方式完成:

my_z_scores <-( my_dummy_data-mean(my_dummy_data) ) / sd(my_dummy_data)

超出您的实际问题,在进行任何进一步分析之前,您可能希望将数据转换为柱状形式:

my_better_dummy_data <- data.frame(gene=colnames(my_dummy_data), expression=as.vector(my_dummy_data) )

在柱状形式中,z 分数可以计算为

my_better_dummy_data$z_score <- (my_better_dummy_data$expression - mean(my_better_dummy_data$expression) / sd(my_better_dummy_data$expression)