【发布时间】:2019-01-12 02:20:47
【问题描述】:
我有一个代表测试集 T 的数据框和另一个代表训练集 D 的数据框。这两个数据集中的列与从同一个数据框中提取的列完全相同。
我使用以下代码对训练集 D 进行归一化
MaxMinNormalize <- function(num) {
if (is.factor(num)) num
else ((num - min(num)) / (max(num) - min(num)))
}
D_n <- as.data.frame(lapply(D, MaxMinNormalize))
数据中的某些列是因子,其他列是数字,这就是归一化函数的原因。
我想在测试集 T 上应用这个标准化步骤,min 和 max 值取自训练集中的各个列,而不是测试集。我该怎么做呢?
感谢您的任何指点!
编辑:按照@coffeinjunky 的指示,尝试了以下代码来测试使用混合类型列(数字和因子)的能力:
df <- mtcars[,c("mpg", "cyl", "am", "gear")]
df$am <- as.factor(df$am)
df$gear <- as.factor(df$gear)
df1 <- df[1:16,]
df2 <- df[17:32,]
summary(df1)
summary(df2)
new_df <- data.frame(sapply(names(df1), function(col) {
ifelse(is.factor(df2[[col]]),
df2[[col]],
(df2[[col]]-min(df1[[col]]))/(max(df1[[col]])-min(df1[[col]])))
}))
head(new_df)
summary(new_df)
但结果很奇怪:不知何故,函数也存储在数据框中,列名丢失了。
> head(new_df)
sapply.names.df1...function.col...
mpg 0.3071429
cyl 1.0000000
am 1.0000000
gear 1.0000000
> summary(new_df)
sapply.names.df1...function.col...
Min. :0.3071
1st Qu.:0.8268
Median :1.0000
Mean :0.8268
3rd Qu.:1.0000
Max. :1.0000
我怀疑处理因子列的ifelse 破坏了数据的结构。
【问题讨论】:
-
T是R中的保留字,表示TRUE。请不要调用您的数据框T。 -
@coffeinjunky 我明白了,谢谢!
-
感谢您接受我的回答。我进一步完善了它。看看可能会有所帮助。