以与从 0 到唯一值长度的因子相同的顺序将因子转换为数字
Convert factor to numeric in the same order of the factor from 0 to length of the unique values
我可以将 new_target
列转换为数字形式。但由于因子形式已经是数字,我只剩下一堆数字。我希望他们订购并重新分配到从 0 到因子长度的等价物。一开始我有一个数字目标,然后我将它量化为 20 个 bin。结果,我获得了包含唯一值 (0,1,3,14,16,18,19)
的 new_target
列。我需要从 0 到 new_target
中唯一值长度的值,而不是这些唯一值。这是 c(0,1,2,3,4,5,6)
。预期输出在 new_target_expected
列中给出。如何在不手动创建的情况下创建 new_target_expected
列?我正在处理一个更大的数据框,无法手动执行此操作。
require(stringr)
require(data.table)
cat_var <- c("rock", "indie", "rock", "rock", "pop", "indie", "pop", "rock", "pop")
cat_var_2 <- c("blue", "green", "red", "red", "blue", "red", "green", "blue", "green")
target_var <- c(30, 10, 27, 14, 29, 25, 27, 12, 10)
df <- data.table("categorical_variable" = cat_var, "categorical_variable_2" = cat_var_2, "target_variable" = target_var)
targetVariable <- "target_variable"
number_of_buckets = 20
# Each bucket should contain equal number of objects
a <- cut(df[[targetVariable]] , breaks = number_of_buckets, labels = 0:(number_of_buckets - 1))
df[["new_target"]] <- a
df[["new_target"]] <- as.numeric(as.character(df[["new_target"]]))
df[["new_target_expected"]] <- c(6, 0, 4, 2, 5, 3, 4, 1, 0)
我们可以用 droplevels
删除未使用的 levels
并将 factor
强制为 integer
。 R
中的索引从 1 开始,因此减去 1 使值从 0 开始。
library(data.table)
df[, (targetVariable) := as.integer(droplevels(a))-1]
-输出
> df
categorical_variable categorical_variable_2 target_variable
1: rock blue 6
2: indie green 0
3: rock red 4
4: rock red 2
5: pop blue 5
6: indie red 3
7: pop green 4
8: rock blue 1
9: pop green 0
我可以将 new_target
列转换为数字形式。但由于因子形式已经是数字,我只剩下一堆数字。我希望他们订购并重新分配到从 0 到因子长度的等价物。一开始我有一个数字目标,然后我将它量化为 20 个 bin。结果,我获得了包含唯一值 (0,1,3,14,16,18,19)
的 new_target
列。我需要从 0 到 new_target
中唯一值长度的值,而不是这些唯一值。这是 c(0,1,2,3,4,5,6)
。预期输出在 new_target_expected
列中给出。如何在不手动创建的情况下创建 new_target_expected
列?我正在处理一个更大的数据框,无法手动执行此操作。
require(stringr)
require(data.table)
cat_var <- c("rock", "indie", "rock", "rock", "pop", "indie", "pop", "rock", "pop")
cat_var_2 <- c("blue", "green", "red", "red", "blue", "red", "green", "blue", "green")
target_var <- c(30, 10, 27, 14, 29, 25, 27, 12, 10)
df <- data.table("categorical_variable" = cat_var, "categorical_variable_2" = cat_var_2, "target_variable" = target_var)
targetVariable <- "target_variable"
number_of_buckets = 20
# Each bucket should contain equal number of objects
a <- cut(df[[targetVariable]] , breaks = number_of_buckets, labels = 0:(number_of_buckets - 1))
df[["new_target"]] <- a
df[["new_target"]] <- as.numeric(as.character(df[["new_target"]]))
df[["new_target_expected"]] <- c(6, 0, 4, 2, 5, 3, 4, 1, 0)
我们可以用 droplevels
删除未使用的 levels
并将 factor
强制为 integer
。 R
中的索引从 1 开始,因此减去 1 使值从 0 开始。
library(data.table)
df[, (targetVariable) := as.integer(droplevels(a))-1]
-输出
> df
categorical_variable categorical_variable_2 target_variable
1: rock blue 6
2: indie green 0
3: rock red 4
4: rock red 2
5: pop blue 5
6: indie red 3
7: pop green 4
8: rock blue 1
9: pop green 0