2012-03-10 85 views
0

我试图做一个简单的转换。我用下面的代码,它工作得很好:R:使用均值和sd函数进行标准化

data_stdz <- transform(data_header, z.v1 = v1+2) 

但是,我不能让下面的代码工作:

data_stdz <- transform(data_header, z.v1 = (v1 - mean(v1))/(2*sd(v1)) 

我也试图让刚刚平均功能工作:

data_stdz <- transform(data_header, z.v1 = mean(v1) 

不过,我不断收到以下错误:

Error: unexpected symbol in: 
"data_std2 <- transform(data_header, z.v1 = mean(v1) 
data_std2" 

所以我猜它与我如何使用mean和sd函数有关,但我一直无法弄清楚。

数据例如:

v1 v2 v3 
6.7 3.8 1.2 
6.3 3.2 1.2 
6.1 2.6 1.6 
7 2.4 1 
NA NA NA 
6.5 3.6 2.6 
6.1 2.4 1.6 
6 5.6 5.2 
7 2.8 1 
6.7 3.8 1.4 
5.7 4.2 2.6 
5.1 5.6 5 
NA NA NA 
+2

该错误不会立即尖叫'mean()'或'sd()'给我。您在两次'transform()'调用中都忽略了左括号。看起来这是问题的原因。 – 2012-03-10 20:30:31

+0

感谢您的加括号Gavin! – Tom 2012-03-10 20:56:56

+0

也值得看看'scale'功能。 – 2012-03-10 21:02:43

回答

1

你的问题很可能(在additon到所说的加文)设备。使用na.rm=TRUE如:

transform(data_header, z.v1 = (v1 - mean(v1, na.rm =T))/(2*sd(v1, na.rm =T))) 
+0

这工作,否则我得到所有新手。 – Tom 2012-03-10 20:56:36

+0

看看德克的建议吧。这可能是一个更好的方法来尝试你的尝试。和汤姆,当你遇到一个函数的问题(不知道你对R有多新奇)时,使用?function.name就像'?mean'一样给你提供了一个很好的函数帮助文件,包括参数。在许多情况下,这是不正确的参数说明,导致错误。 – 2012-03-10 21:02:00

+0

R很新,但看到双括号并不新鲜。感谢您的建议,因为我查找有关平均函数的信息,并没有帮助,但是“平均值”是。 – Tom 2012-03-10 21:19:07

2

基础R具有用于此目的的scale()功能。

+0

尽管我的回答解答了海报的即时问题,但Dirks是一种更好的方法来处理您的尝试。 “规模”有很多其他的论点,这使得这对于许多不同的任务来说非常方便。 – 2012-03-10 20:58:30

+0

我确实考虑过scale()函数,但不知道如何使用它来计算2 * sd。 – Tom 2012-03-10 21:12:01