在 R 中转换 "others" 中分类变量的低频水平
convert low frequent levels of a categorical variable in "others" in R
我有一个分类变量,我想将其转换为分类任务的虚拟变量。问题是某些级别只出现几次,因此当我将样本拆分为训练集和测试集时,它们会产生完全多重共线性问题。
我怎样才能快速而优雅地摆脱这些关卡?
这是我的数据的一个简单示例:
label var_x
1 1
0 2
1 1
0 3
1 2
0 4
0 5
1 5
1 1
....
假设我只想保留出现次数超过 1(或任何其他数字)的级别
我想将这些情况重新编码为“0”并获得如下内容:
label var_x
1 1
0 2
1 1
0 0
1 2
0 0
0 5
1 5
1 1
....
感谢您的帮助
一个dplyr
选项可以是:
df %>%
add_count(var_x) %>%
mutate(var_x = as.numeric(n > 1)*var_x) %>%
select(-n)
label var_x
<int> <dbl>
1 1 1
2 0 2
3 1 1
4 0 0
5 1 2
6 0 0
7 0 5
8 1 5
9 1 1
与base R
相同的想法:
as.numeric(with(data.frame(table(df$var_x)), Freq[match(df$var, Var1)]) > 1)*df$var_x
我想你需要这个:
mtcars %>%
mutate(cyl_factor = forcats::fct_lump(as_factor(cyl),prop=.4),
disp_factor = forcats::fct_lump_min(as_factor(disp), min = 2)) %>%
head(10)
mpg cyl disp hp drat wt qsec vs am gear carb cyl_factor disp_factor
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Other 160
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Other 160
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Other Other
4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Other Other
5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 8 360
6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Other Other
7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 8 360
8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 Other Other
9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Other Other
10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 Other 167.6
我有一个分类变量,我想将其转换为分类任务的虚拟变量。问题是某些级别只出现几次,因此当我将样本拆分为训练集和测试集时,它们会产生完全多重共线性问题。
我怎样才能快速而优雅地摆脱这些关卡? 这是我的数据的一个简单示例:
label var_x
1 1
0 2
1 1
0 3
1 2
0 4
0 5
1 5
1 1
....
假设我只想保留出现次数超过 1(或任何其他数字)的级别 我想将这些情况重新编码为“0”并获得如下内容:
label var_x
1 1
0 2
1 1
0 0
1 2
0 0
0 5
1 5
1 1
....
感谢您的帮助
一个dplyr
选项可以是:
df %>%
add_count(var_x) %>%
mutate(var_x = as.numeric(n > 1)*var_x) %>%
select(-n)
label var_x
<int> <dbl>
1 1 1
2 0 2
3 1 1
4 0 0
5 1 2
6 0 0
7 0 5
8 1 5
9 1 1
与base R
相同的想法:
as.numeric(with(data.frame(table(df$var_x)), Freq[match(df$var, Var1)]) > 1)*df$var_x
我想你需要这个:
mtcars %>%
mutate(cyl_factor = forcats::fct_lump(as_factor(cyl),prop=.4),
disp_factor = forcats::fct_lump_min(as_factor(disp), min = 2)) %>%
head(10)
mpg cyl disp hp drat wt qsec vs am gear carb cyl_factor disp_factor
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Other 160
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Other 160
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Other Other
4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Other Other
5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 8 360
6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Other Other
7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 8 360
8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 Other Other
9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Other Other
10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 Other 167.6