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

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

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


当前回答

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

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

全数据帧

trainingSet <- scale(trainingSet)

其他回答

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

dataframe <- apply(dataframe, 2, scale)

@BBKim给出了最好的答案,但它可以做得更短。我很惊讶居然还没人想到。

<- data.frame(x = rnorm(10,30, .2), y = runif(10,3,5)) 应用(dat, 2, function(x) (x - mean(x)) / sd(x))

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

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

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

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

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

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

就是这样。

使用“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=&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")