我正在尝试使用[0,1]范围规范化具有不同属性(数字,布尔值...)的人员表,并且我尝试了这个函数:
ranging<-function(x){(x-min(x))/(max(x)-min(x))}
但显然它从整个表中得到了最小值和最大值。我不习惯R编程,如何获得每列的最小值和最大值,以便正确地对每列进行标准化?
答案 0 :(得分:3)
假设您正在使用名为df而没有任何因子变量的data.frame,以下代码应该可以在没有任何特殊包的情况下运行(如@ user20650所示:
ranging<-function(x){(x-min(x))/(max(x)-min(x))}
dfNorm <- lapply(df, ranging)
如果您的data.frame包含不应规范化的因子变量,则可以使用以下内容:
dfNorm <- lapply(df, function(x) ifelse(is.factor(x), x, ranging(x)))
答案 1 :(得分:1)
如果我们使用dplyr
,mutate_each
可以使用ranging
函数并应用于数据集的所有列。
library(dplyr)
df1 %>%
mutate_each(funs(ranging))
df1 <- structure(list(v3 = c(0L, 2L, 1L, 4L, 2L, 2L, 2L, 2L),
v4 = c(1L,
4L, 2L, 5L, 3L, 3L, 3L, 3L), v5 = c(2L, 6L, 4L, 6L, 4L, 4L, 4L,
4L), v6 = c(3L, 5L, 7L, 4L, 5L, 5L, 5L, 5L)), .Names = c("v3",
"v4", "v5", "v6"), row.names = c(NA, -8L), class = "data.frame")