【发布时间】:2016-07-26 06:42:34
【问题描述】:
我不是 R 专家...
在我的训练数据中,有一个名为 Source 的字段有 30 个级别,我只想保留前 2 个级别,因为它们占多数,并且需要将所有其他 28 个级别更改为“其他” .这样我以后应用 One-Hot Encoding 会更方便。
我在这里检查了解决方案:Solution 1 和 Solution 2
我还是被卡住了……
以下是我尝试过的主要解决方案:
train 是原始训练数据,x_train 只是一个副本。 Source 是一个因子变量。
前 2 个级别是 'S122' 级别 1 和 'S133' 级别 8
试试 1
这里我使用which,所以我不需要先将因子转换为字符。事实上,在使用which之前,我尝试过将因子转换为字符。结果是一样的,没用....在这里运行代码后,没有任何改变,只是增加了1个级别,称为'Other'...
x_train <- train
levels(x_train$Source) <- c(levels(x_train$Source), "Other")
x_train$Source[which((x_train$Source != 'S122') && (x_train$Source != 'S133'))] <- 'Other'
str(x_train$Source)
同时,在这种情况下,我没有使用像revalue()这样的方法,因为有28个级别需要更改,我不想在一个方法中写入28个值......
试试 2
然后,我改用一种非常简单的方式,迭代……我也尝试了while循环,也没有用。
x_train <- train
for (i in 1:30) {
if (i == 1 || i == 8) {
next
}
levels(x_train$Source)[i] <- 'Other'
}
使用此方法后,并不是所有的28个级别都会改变,我意识到,虽然这些级别的值已经改变,但总级别的长度也在改变,索引也会改变。这就是为什么我改为 while 循环但它仍然没有工作....
因此,我有什么办法只保留前 2 个级别并将所有其他级别更改为“其他”?
【问题讨论】:
-
您解决了这个问题吗?如果有,请分享,如果没有,请加reproducible example。
-
是的,我解决的方法很简单,但是看起来很傻,我今天下班后分享~