我有一个名为spam的数据集,其中包含58列和约3500行与垃圾邮件相关的数据。
我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。
有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。
我有一个名为spam的数据集,其中包含58列和约3500行与垃圾邮件相关的数据。
我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。
有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。
当前回答
dplyr包有两个函数可以做到这一点。
> require(dplyr)
要更改数据表的特定列,可以使用mutate_at()函数。要更改所有列,可以使用mutate_all。
下面是使用这些函数来标准化数据的简单示例。
改变特定的列:
dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_at(vars("a", "c"), scale)) # can also index columns by number, e.g., vars(c(1,3))
> apply(dt, 2, mean)
a b c
1.783137e-16 5.064855e-01 -5.245395e-17
> apply(dt, 2, sd)
a b c
1.0000000 0.2906622 1.0000000
改变所有列:
dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_all(scale))
> apply(dt, 2, mean)
a b c
-1.728266e-16 9.291994e-17 1.683551e-16
> apply(dt, 2, sd)
a b c
1 1 1
其他回答
当我使用Dason提出的解决方案时,而不是得到一个数据帧作为结果,我得到了一个数字向量(我的df的缩放值)。
为了防止有人遇到同样的问题,你必须在代码中添加as.data.frame(),就像这样:
df.scaled <- as.data.frame(scale(df))
我希望这对有同样问题的人有用!
'插入'包提供了预处理数据的方法(例如居中和缩放)。你也可以使用下面的代码:
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
在我碰巧发现这条线索之前,我也有同样的问题。我有用户依赖的列类型,所以我写了一个for循环遍历它们并获得所需的列。也许有更好的方法,但这个方法很好地解决了问题:
for(i in 1:length(colnames(df))) {
if(class(df[,i]) == "numeric" || class(df[,i]) == "integer") {
df[,i] <- as.vector(scale(df[,i])) }
}
作为。向量是一个必要的部分,因为scale做rownames x 1矩阵这通常不是你想要的在data。frame中。
使用“recommderlab”包。下载并安装软件包。 这个包内置了一个命令“Normalize”。它还允许你从众多归一化方法中选择一种即"中心"或" 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")
您还可以使用数据轻松地将数据规范化。clusterSim包中的归一化函数。它提供了不同的数据规范化方法。
data.Normalization (x,type="n0",normalization="column")
参数
x 向量,矩阵或数据集 类型 归一化类型: N0 -没有归一化
N1 -标准化((x-mean)/sd)
N2 -位置标准化((x-median)/mad)
N3 -单元化((x-mean)/range)
N3a -位置单元化(x-median /range)
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/range)
N8 -商变换(x/max)
N9 -商数变换(x/mean)
N9a -位置商变换(x/median)
N10 -商变换(x/sum)
n11 -商变换(x/√(SSQ))
N12 -归一化((x-mean)/根号(sum((x-mean)^2))
N12a -位置归一化((x-median)/平方根(sum(x-median)^2))
N13 -归一化,中心点为0 ((x-midrange)/(range/2))
归一化 "列" -由变量归一化,"行" -由对象归一化