我正在尝试分析我的第一个数据集。我想在集合中预先形成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(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))
之后我有点失落,因为我无法让它发挥作用。
答案 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)