数据集的标准化与r中KNN之前的数字和因子

时间:2018-02-13 17:46:28

标签: r normalization knn

我正在尝试分析我的第一个数据集。我想在集合中预先形成KNN,但很难找到一种方法来规范它。它包含20个变量和30k观测值。变量既是因子又是数字。我已经明白我必须创建自己的两个功能吗?

有人可以帮我创建一个用数字和因子标准化数据集的方法吗?这真的很有帮助!

更多信息: 我从数据集中取出了7个变量。年龄(int),军事(因素,3个级别),教育(因素,11个级别),住房(因子2,水平),联系(因素,2个级别)和收入(int)。

我所想到的是将所有变量与数字相结合,然后将其标准化为0到1之间的值。我已经理解这是必需的,因为我的原始数据(/值)不一致。例如:年龄在7到86之间,收入在0到13万美元之间,我也有一些因素。

首先我将变量转换为数字:

df=data.frame(as.numeric(as.factor(df$age)),
                    as.numeric(as.factor(df$job)),
                    as.numeric(as.factor(df$marital)),
                    as.numeric(as.factor(df$education)),
                    as.numeric(as.factor(df$housing)),
                    as.numeric(as.factor(df$contact)),
                    as.numeric(as.factor(df$income))

然后将colnames更改回转换前的内容。

colnames(df)=c("age","job","marital","education","housing","contact",
                     "income")

然后我发现了我试图应用于该集合的这个功能。

normalize <- function(x) {
    return ((x - min(x)) / (max(x) - min(x)))
  }

dfnormlize <- as.data.frame(lapply(df, normalize))

之后我有点失落,因为我无法让它发挥作用。

1 个答案:

答案 0 :(得分:1)

如果您提供了数据示例并说明了您尝试过的内容,那将会很有帮助。我将根据您提供的信息对答案进行评论。希望这能满足您的需求。

首先,我们创建一个包含一个因子,一个整数和两个数字列的data.frame。

   d <- data.frame(x=runif(10), f=as.factor(rep("X", 10)), y=runif(10),
                i=as.integer(c(rep(1,5), rep(2,5))))

然后,我们可以创建一个索引,指示哪些列是数字和整数。根据整数列的性质,您可能希望将其从规范化中省略,但是,我想提供一个能够捕获除数字之外的其他内容的示例。

( nidx <- grep(paste(c("numeric","integer"), collapse="|"), lapply(d, class)) )

现在我们可以使用索引来操作和替换数字列。

d[,nidx] <- scale(d[,nidx]) 
str( d )

如果要将函数应用于每个列,可以在列索引上使用for循环,或者只使用apply

norm <- function(x) { (x - min(x)) / (max(x) - min(x)) }

  for(i in nidx) { d[,i] <- norm( d[,i] ) }         # example 1

  d[,nidx] <- apply(d[,nidx], MARGIN=2, FUN=norm ) # example 2

把它放到一个例子中

d <- data.frame(x=runif(10), f=as.factor(rep("X", 10)), y=runif(10),
                i=as.integer(c(rep(1,5), rep(2,5))))
( nidx <- grep(paste(c("numeric","integer"), collapse="|"), lapply(d, class)) )
norm <- function(x) { (x - min(x)) / (max(x) - min(x)) } 
d[,nidx] <- apply(d[,nidx], MARGIN=2, FUN=norm )
str(d)