2016-07-03 124 views
0

我试图根据对照组的(dx = 1)均值和标准差创建z-评分变量。我想循环所有我感兴趣的变量(PCT:CST.L)来创建这些z分数。我将如何做到这一点?这是我的数据。在R循环中创建变量

X dx PCT CST.R CST.L 
1 1 Control 15 30  5 
2 2 Control 20 24  22 
3 3 Clinical 25 20  14 
4 4 Control 17 13  12 
5 5 Clinical 14 12  11 
6 6 Control 13 20  15 

而且在这里,我希望它看起来像(至少是标题,至少)。

X dx PCT CST.R CST.L PCT_Z CST.R_Z CST.L_Z 
1 1 Control 15 30  5 
2 2 Control 20 24  22 
3 3 Clinical 25 20  14 
4 4 Control 17 13  12 
5 5 Clinical 14 12  11 
6 6 Control 13 20  15 

数据

structure(list(X = 1:6, dx = c("Control", "Control", "Clinical", 
"Control", "Clinical", "Control"), PCT = c(15L, 20L, 25L, 17L, 
14L, 13L), CST.R = c(30L, 24L, 20L, 13L, 12L, 20L), CST.L = c(5L, 
22L, 14L, 12L, 11L, 15L)), .Names = c("X", "dx", "PCT", "CST.R", 
"CST.L"), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6")) 
+0

dd [,paste0(c(“PCT”,“CST.R”,“CST.L”),'_Z')] < - scale(dd [,c(“PCT”,“ CST.R“,”CST.L“)])' – rawr

+0

[related](http://stackoverflow.com/questions/6148050/creating-z-scores)我没有读得很好。你想通过控制和临床组获得zscores?我不知道'dx = 1'的意思和sd是什么意思 - 没有一个单一的观测sd – rawr

回答

0

我会假设你要计算Z值的每一列。

Z分数计算为(X - mean)/Standard deviationX这里将是选定列中的每一行。

> df = data.frame(X = 1:6, 
+   dx = c("Control", "Control", "Clinical", "Control", "Clinical", "Control"), 
+   PCT = c(15L, 20L, 25L, 17L, 14L, 13L), 
+   CST.R = c(30L, 24L, 20L, 13L, 12L, 20L), 
+   CST.L = c(5L, 22L, 14L, 12L, 11L, 15L)) 
> df 
    X  dx PCT CST.R CST.L 
1 1 Control 15 30  5 
2 2 Control 20 24 22 
3 3 Clinical 25 20 14 
4 4 Control 17 13 12 
5 5 Clinical 14 12 11 
6 6 Control 13 20 15 
> 
> colsToCalculate = colnames(df[, 3:5]) 
> newCols = c('PCT_Z', 'CST.R_Z', 'CST.L_Z') 
> 
> for (i in seq(newCols)) { 
+ data = df[, colsToCalculate[i]] 
+ df[, newCols[i]] = (data - mean(data))/sd(data) 
+ } 
> 
> df 
    X  dx PCT CST.R CST.L  PCT_Z  CST.R_Z CST.L_Z 
1 1 Control 15 30  5 -0.51830527 1.50280954 -1.4675659 
2 2 Control 20 24 22 0.59234888 0.61590555 1.5873672 
3 3 Clinical 25 20 14 1.70300302 0.02463622 0.1497516 
4 4 Control 17 13 12 -0.07404361 -1.01008510 -0.2096523 
5 5 Clinical 14 12 11 -0.74043610 -1.15790243 -0.3893542 
6 6 Control 13 20 15 -0.96256693 0.02463622 0.3294536 
> 
+0

这绝对是正确的方向,但是当我玩这个功能时,我的新列都说NA。任何想法为什么发生这种情况? – anniea

+0

我想通了!谢谢!! – anniea

+0

可能有些类型/类不一致...很高兴帮助你 – shawnl