标准化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=”), items=paste('i', 1:10, sep=”))) ## 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
是一个需要的部分,因为它变成了scale
做rownames x 1
matrix这通常不是你想在你的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)