如何将数据列转换为z分数?

时间:2014-11-19 15:45:48

标签: r

我有一个标签分隔的文本文件,其中包含多列数据。我想将每列中的值转换为z分数,以便我可以更好地比较每列中的分布。有谁知道快速的方法吗?我一直在学习 R 并认为 R 可能有一个有效的方法来做到这一点,但欢迎任何解决方案。我希望明天使用z分数为演示文稿制作一些数字,因此速度至关重要。

表格示例:

CHROM   BIN_START   BIN_END N_VARIANTS  dataset1    dataset2    dataset3    dataset4    dataset5    dataset6    dataset7
chr1    1   500000  3881    0.0287298   0.0527506   0.0306643   0   0   0.12356 0
chr1    500001  1000000 3370    0.026538    0   0   0   0   0.0887265   0
chr1    1000001 1500000 2851    0.10893 0   0.0391224   0   0   0.0074585   0
chr1    1500001 2000000 3167    0.0612552   0   0   0   0   0.0527309   0
chr1    2000001 2500000 2592    0.154722    0   0.00540119  0   0   0.276087    0
chr1    2500001 3000000 4096    0.0214323   0.0521432   0   0.0505466   0.0367322   0.0147888   0
chr1    3000001 3500000 3825    0.100806    0   0.203501    0.00675269  0   0.10611 0.122551
chr1    3500001 4000000 2597    0   0.172489    0   0.127946    0.0976384   0.058526    0
chr1    4000001 4500000 3497    0   0.0280811   0   0.0137599   0   0.113574    0.0452258
chr1    4500001 5000000 4828    0   0.019744    0   0   0.0231157   0   0
chr1    5000001 5500000 4314    0.0247076   0   0   0.00943007  0.00186957  0.0240571   0.138595
chr1    5500001 6000000 3529    0.0168133   0   0.00544462  0   0   0   0
chr1    6000001 6500000 2396    0   0   0.0425213   0   0   0.0176949   0
chr1    6500001 7000000 4154    0   0.0827602   0   0   0   0.0583389   0
chr1    7000001 7500000 2590    0   0   0   0   0.106904    0   0.0885134
chr1    7500001 8000000 2939    0.108101    0.0472759   0.0201759   0.0169716   0.176171    0.0371988   0.154431
chr1    8000001 8500000 3820    0   0   0   0.0081009   0   0.0305172   0

2 个答案:

答案 0 :(得分:5)

尝试使用scale函数:默认情况下,它会减去均值并除以每列的sd(即Z变换)。

假设您只想缩放dataset列:

sc_cols <- grepl("^dataset",names(tt))
tt2 <- tt
tt2[sc_cols] <- scale(tt2[sc_cols]) 
zapsmall(sapply(tt2[,-1],mean))
## BIN_START    BIN_END N_VARIANTS   dataset1   dataset2   dataset3   dataset4 
##   4000001    4500000       3438          0          0          0          0 
##  dataset5   dataset6   dataset7 
##         0          0          0 
sapply(tt2[,-1],sd)
##   BIN_START      BIN_END   N_VARIANTS     dataset1     dataset2     dataset3 
## 2524876.2346 2524876.2346     709.2381       1.0000       1.0000       1.0000 
##    dataset4     dataset5     dataset6     dataset7 
##      1.0000       1.0000       1.0000       1.0000 

答案 1 :(得分:3)

您可以使用base::scale

df$N_VARIANTS <- scale(df$N_VARIANTS)

# several at once
df[cols <- c('N_VARIANTS', 'dataset1', 'dataset2')] <-
  lapply(cols, function(x) scale(df[[x]]))