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

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

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


当前回答

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

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

其他回答

下面的代码可能是实现这一目标的最短方法。

dataframe <- apply(dataframe, 2, scale)

我假设你想要的是均值为0,标准差为1。如果你的数据在一个数据框架中,所有的列都是数值的,你可以简单地调用数据上的缩放函数来做你想做的事情。

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)

使用内置函数是有品位的。比如这只猫:

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

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列已经规范化。不需要软件包:-)

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

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

这是三年前的。不过,我还是觉得有必要补充以下几点:

最常见的归一化是z变换,其中减去平均值并除以变量的标准差。结果将是mean=0, sd=1。

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

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

就是这样。