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

我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。

有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。


当前回答

当我使用Dason提出的解决方案时,而不是得到一个数据帧作为结果,我得到了一个数字向量(我的df的缩放值)。

为了防止有人遇到同样的问题,你必须在代码中添加as.data.frame(),就像这样:

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

我希望这对有同样问题的人有用!

其他回答

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

缩放是有限的,因为它缩放所有变量。下面的解决方案只允许缩放特定的变量名,同时保持其他变量不变(变量名可以动态生成):

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_at(c("y", "z"), ~(scale(.) %>% as.vector))
dat2

这给了我这个:

> dat
          x        y        z
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

and

> dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
> dat2
          x          y           z
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

编辑1(2016):处理朱利安的评论:规模的输出是Nx1矩阵,所以理想情况下,我们应该添加一个as。向量,将矩阵类型转换回向量类型。谢谢朱利安!

编辑2(2019):引用杜乔·A。对于最新的dplyr(0.8版本),您需要更改dplyr::funcs with list,如dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))

EDIT 3(2020):感谢@mj_whales:旧的解决方案已弃用,现在我们需要使用mutate_at。

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

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 (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))

归一化 "列" -由变量归一化,"行" -由对象归一化

再说一次,尽管这是一个老问题,但它非常相关!我发现了一个简单的方法来规范化某些列,而不需要任何包:

normFunc <- function(x){(x-mean(x, na.rm = T))/sd(x, na.rm = T)}

例如

x<-rnorm(10,14,2)
y<-rnorm(10,7,3)
z<-rnorm(10,18,5)
df<-data.frame(x,y,z)

df[2:3] <- apply(df[2:3], 2, normFunc)

您将看到y和z列已经规范化。不需要软件包:-)

当我使用Dason提出的解决方案时,而不是得到一个数据帧作为结果,我得到了一个数字向量(我的df的缩放值)。

为了防止有人遇到同样的问题,你必须在代码中添加as.data.frame(),就像这样:

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

我希望这对有同样问题的人有用!