我有一个名为spam的数据集,其中包含58列和约3500行与垃圾邮件相关的数据。
我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。
有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。
我有一个名为spam的数据集,其中包含58列和约3500行与垃圾邮件相关的数据。
我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。
有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。
当前回答
@BBKim给出了最好的答案,但它可以做得更短。我很惊讶居然还没人想到。
<- data.frame(x = rnorm(10,30, .2), y = runif(10,3,5)) 应用(dat, 2, function(x) (x - mean(x)) / sd(x))
其他回答
下面的代码可能是实现这一目标的最短方法。
dataframe <- apply(dataframe, 2, scale)
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
@BBKim给出了最好的答案,但它可以做得更短。我很惊讶居然还没人想到。
<- data.frame(x = rnorm(10,30, .2), y = runif(10,3,5)) 应用(dat, 2, function(x) (x - mean(x)) / sd(x))
'插入'包提供了预处理数据的方法(例如居中和缩放)。你也可以使用下面的代码:
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
再说一次,尽管这是一个老问题,但它非常相关!我发现了一个简单的方法来规范化某些列,而不需要任何包:
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列已经规范化。不需要软件包:-)