标准化R中的数据列

我有一个名为spam的数据集,其中包含58列和大约3500行与垃圾邮件相关的数据。

我打算在将来对这个数据集进行一些线性回归,但是我想事先做一些预处理,并将列标准化为零均值和单位方差。

我已经被告知最好的方式去与R,所以我想问我怎样才能实现与R的规范化 ? 我已经得到了正确的数据加载,我只是寻找一些软件包或方法来执行此任务。

我必须假设你的意思是说你想要一个0的平均值和一个标准偏差1.如果你的数据是在一个数据框中,所有的列都是数字的,你可以简单地调用数据上的scale函数来做你想做的事情。

 dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) scaled.dat <- scale(dat) # check that we get mean of 0 and sd of 1 colMeans(scaled.dat) # faster version of apply(scaled.dat, 2, mean) apply(scaled.dat, 2, sd) 

使用内置函数是优雅的。 像这只猫:

在这里输入图像说明

意识到这个问题很老,一个答案被接受,我会提供另一个参考答案。

scale受限于所有variables的规模。 下面的解决scheme允许仅缩放特定的variables名称,同时保持其他variables不变(并且可以dynamic生成variables名称):

 library(dplyr) set.seed(1234) dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5), z = runif(10, 10, 20)) dat dat2 <- dat %>% mutate_each_(funs(scale(.) %>% as.vector), vars=c("y","z")) dat2 

这给了我这个:

 > dat xyz 1 29.75859 3.633225 14.56091 2 30.05549 3.605387 12.65187 3 30.21689 3.318092 13.04672 4 29.53086 3.079992 15.07307 5 30.08582 3.437599 11.81096 6 30.10121 4.621197 17.59671 7 29.88505 4.051395 12.01248 8 29.89067 4.829316 12.58810 9 29.88711 4.662690 19.92150 10 29.82199 3.091541 18.07352 

 > dat2 <- dat %>% mutate_each_(funs(scale(.) %>% as.vector), > vars=c("y","z")) > dat2 xyz 1 29.75859 -0.3004815 -0.06016029 2 30.05549 -0.3423437 -0.72529604 3 30.21689 -0.7743696 -0.58772361 4 29.53086 -1.1324181 0.11828039 5 30.08582 -0.5946582 -1.01827752 6 30.10121 1.1852038 0.99754666 7 29.88505 0.3283513 -0.94806607 8 29.89067 1.4981677 -0.74751378 9 29.88711 1.2475998 1.80753470 10 29.82199 -1.1150515 1.16367556 

编辑 :解决Julian的评论: scale的输出是Nx1matrix,所以理想情况下,我们应该添加一个as.vector将matrixtypes转换回向量types。 谢谢Julian!

这是3岁。 不过,我觉得我必须添加以下内容:

最常见的归一化就是z变换 ,在这里你将平均值除以variables的标准差。 结果将有平均= 0和SD = 1。

为此,你不需要任何包裹。

 zVar <- (myVar - mean(myVar)) / sd(myVar) 

而已。

“插入”软件包提供了预处理数据的方法(例如居中和缩放)。 你也可以使用下面的代码:

 library(caret) # Assuming goal class is column 10 preObj <- preProcess(data[, -10], method=c("center", "scale")) newData <- predict(preObj, data[, -10]) 

更多细节: http : //www.inside-r.org/node/86978

您也可以使用clusterSim包中的data.Normalization函数轻松规范化数据。 它提供了不同的数据规范化方法。

  data.Normalization (x,type="n0",normalization="column") 

参数

X
vector,matrix或数据集types
规范化types:n0 – 没有规范化

n1 – 标准化((x-mean)/ sd)

n2 – 位置标准化((x-median)/ mad)

n3 – 单位化((x-均值)/范围)

n3a – 位置单位化((x中位数)/范围)

n4 – 零最小((x-min)/范围)的单位化

n5 – 范围<-1,1>((x-mean)/ max(abs(x-mean))的归一化)

n5a – 范围<-1,1>((x-median)/ max(abs(x-median))的位置归一化)

n6 – 商数转换(x / sd)

n6a – 位置商转换(x / mad)

n7 – 商数转换(x /范围)

n8 – 商数转换(x / max)

n9 – 商数转换(x /均值)

n9a – 位置商转换(x /中值)

n10 – 商数转换(x / sum)

n11 – 商数转换(x / sqrt(SSQ))

n12 – 归一化((x-mean)/ sqrt(sum((x-mean)^ 2)))

n12a – 位置归一化((x-median)/ sqrt(sum((x-median)^ 2)))

n13 – 以0为中心点((x-midrange)/(range / 2))归一化

正常化
“列” – 由variables标准化,“行” – 按对象标准化

当我使用Dason所说的解决scheme时,我得到了一个数字向量(我的df的缩放值)。

如果有人遇到同样的麻烦,你必须添加as.data.frame()代码,如下所示:

 df.scaled <- as.data.frame(scale(df)) 

我希望这将是有用的脂肪酶具有相同的问题!

使用软件包“recommenderlab”。 下载并安装软件包。 这个包里面有一个命令“Normalize”。 它也允许你select多种方法之一进行标准化,即“中心”或“Z分数”按照下面的例子:

 ## create a matrix with ratings m <- matrix(sample(c(NA,0:5),50, replace=TRUE, prob=c(.5,rep(.5/6,6))),nrow=5, ncol=10, dimnames = list(users=paste('u', 1:5, sep=&rdquo;), items=paste('i', 1:10, sep=&rdquo;))) ## do normalization r <- as(m, "realRatingMatrix") #here, 'centre' is the default method r_n1 <- normalize(r) #here "Z-score" is the used method used r_n2 <- normalize(r, method="Z-score") r r_n1 r_n2 ## show normalized data image(r, main="Raw Data") image(r_n1, main="Centered") image(r_n2, main="Z-Score Normalization") 

在我碰巧find这个线程之前,我遇到了同样的问题。 我有用户依赖的列types,所以我写了一个for循环通过他们,并得到需要的列'd。 有可能有更好的方法来做到这一点,但这解决了这个问题很好:

  for(i in 1:length(colnames(df))) { if(class(df[,i]) == "numeric" || class(df[,i]) == "integer") { df[,i] <- as.vector(scale(df[,i])) } } 

as.vector是一个需要的部分,因为它变成了scalerownames x 1matrix这通常不是你想在你的data.frame有什么。

Scale可以用于完整的数据框和特定的列。 对于特定列,可以使用以下代码:

 trainingSet[, 3:7] = scale(trainingSet[, 3:7]) # For column 3 to 7 trainingSet[, 8] = scale(trainingSet[, 8]) # For column 8 

完整的数据框架

 trainingSet <- scale(trainingSet)