有没有办法计算数据框中一行中所有值的 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)
我有一个数据框,其中包含一个基因在 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)