需要对数字和分类变量进行R归一化

时间:2019-09-02 12:08:55

标签: r

我需要找到一些功能:{magic_function_1magic_function_2}或类似的功能才能实现以下内容。


假设我们具有此辅助功能:

my.normalize = function(vec){
  if (is.numeric(vec)) {
    vec = (vec - min(vec)) / (max(vec) - min(vec))
  }
  return (vec)
}

初始数据集:

ds_1 = data.frame(
  score = c(142, 89, 540, 38, 232, 142),
  age = c(20, 18, 76, 54, 15, 22),
  points = c(4, 50, 100, 10, 9, 35),
  group = c("A", "B", "A", "A", "C", "B"),
  favoritedrink = c("Coke", "Water", "Water", "Wine", "Tea", "Coke"),
  type = c("1", "2", "3", "1", "2", "1")
)
ds_1
##   score age points group favoritedrink type
## 1   142  20      4     A          Coke    1
## 2    89  18     50     B         Water    2
## 3   540  76    100     A         Water    3
## 4    38  54     10     A          Wine    1
## 5   232  15      9     C           Tea    2
## 6   142  22     35     B          Coke    1

我要模拟的东西:

ds_2 = mutate_if(ds_1, is.numeric, my.normalize)
ds_3 = data.frame(model.matrix(~ score + age + points + group + favoritedrink + type, data = ds_2))[, -1]
ds_3
##       score        age     points groupB groupC favoritedrinkTea
## 1 0.2071713 0.08196721 0.00000000      0      0                0
## 2 0.1015936 0.04918033 0.47916667      1      0                0
## 3 1.0000000 1.00000000 1.00000000      0      0                0
## 4 0.0000000 0.63934426 0.06250000      0      0                0
## 5 0.3864542 0.00000000 0.05208333      0      1                1
## 6 0.2071713 0.11475410 0.32291667      1      0                0
##   favoritedrinkWater favoritedrinkWine type2 type3
## 1                  0                 0     0     0
## 2                  1                 0     1     0
## 3                  1                 0     0     1
## 4                  0                 1     0     0
## 5                  0                 0     1     0
## 6                  0                 0     0     0

例如,我正在寻找一些魔术功能:magic_function_1以实现以下目标:

ds_3 = magic_function_1(ds_1)
# where that magic function also saves the following config:
ds_3.config = [saved config to convert future values with same parameters]

其中ds_3应该与前面显示的表/输出相同,而ds_3.config是使转换成为可能的配置。以后可以使用此配置进行转换,以保持相同的比例/参数/等。例如,可以在该配置内部存储数字变量的最小/最大值,或分类变量的可能值,等等。 / p>

然后...

如果将来,请输入以下内容:

input = ds_1[5,]
rownames(input) = NULL # just resetting the row indexes
input

位于初始表上,那么我们得到以下信息:

out_1 = magic_function_2(input, ds_3.config)

all(out_1 == ds_3[5,]) == TRUE # in other words: out_1 should be equals to ds_3[5,] which is the corresponding row after normalization

此外,当使用ds_1上不需要的其他任何输入时,例如:

input = data.frame(
  score = 100,
  age = 16,
  points = 73,
  group = "C",
  favoritedrink = "Water",
  type = "2"
)

当我们打电话时:

out_2 = magic_function_2(input, ds_3.config)

然后,在out_2上,数字值应根据ds_3.config进行适当缩放,并相应地转换分类值(如您在上面第二张表中所见)。

另一方面,如果我们传递了原始数据集ds_1以外的某些分类值,例如:

input = data.frame(
  score = 100,
  age = 16,
  points = 73,
  group = "C",
  favoritedrink = "Rum",
  type = "2"
)

当我们打电话时:

out_3 = magic_function_2(input, ds_3.config)

然后,我们将得到一个错误,因为Rum不在初始数据集中。

0 个答案:

没有答案