R如何保持最高水平并改变所有其他水平

R how to keep top levels and change all the other levels

我不是 R 方面的专家...

在我的训练数据中,有一个名为 Source 的字段,它有 30 个级别,我只想保留前 2 个级别,因为它们占多数,并且需要更改所有其他 28 个级别到 'Other'。这样我以后应用One-Hot Encoding会更方便

我在这里检查了解决方案:Solution 1 and Solution 2

我还是卡住了...

以下是我尝试过的主要解决方案:

train是原始训练数据,x_train只是一个副本。 Source 是一个因子变量。 前2个级别是'S122'是level1,'S133'是level8

尝试 1

这里我用的是which,这样我就不需要先把factor转换成character了。其实在使用which之前,我尝试过将factor转换成character。结果是一样的,没有用....在 运行 这里的代码之后,没有任何改变,只是增加了 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个level都变了,我发现,虽然这些level的值变了,但是总level的长度也在变,index也会变。这就是为什么我更改为 while 循环但仍然无效的原因....

所以请问有什么办法可以只保留前2个关卡,其他关卡全部改成'Other'?

这不是一个可重现的例子,因为你没有提供数据,但假设你的因素是火车的一部分,你可以使用。

levels(train$source) <-c("S122", "S133", rep("Other",3))

例如,想象一下泰坦尼克号的数据。

titanic <- reshape2::melt(Titanic)
head(titanic)
  Class    Sex   Age Survived value
1   1st   Male Child       No     0
2   2nd   Male Child       No     0
3   3rd   Male Child       No    35
4  Crew   Male Child       No     0
5   1st Female Child       No     0
6   2nd Female Child       No     0

现在,假设我想重新标记因素,使最高的两个因素在 class 中,其他因素在另一个 class 中。我不需要任何 for 循环。我就写

 levels(titanic$Class) <-c("High", "High", "Low", "Low")

现在,当我查看级别时,我得到

titanic
   Class    Sex   Age Survived value
1   High   Male Child       No     0
2   High   Male Child       No     0
3    Low   Male Child       No    35
4    Low   Male Child       No     0
5   High Female Child       No     0
6   High Female Child       No     0

终于解决了这个问题,但是解决的不是很智能。所以,如果这个问题有更好的解决方案,请随时post这里

让我们回忆一下我在问题中提到的主要部分:

x_traintrain 的副本。

x_train$Source 有 30 个级别,level1 是 'S122' 和 level8 是 [=52= 】,我只想保留这2个等级,其他28个等级设置为'Other'。

如果您还不清楚这个描述,请看这里的例子:

原创x_train$来源30级

S122, S123, S124.., S133, S134,....

最终 x_train$ 源级别

S122,其他,S133

我的问题是如何得出最终结果,如何将30个关卡变成3个关卡

解决方法如下:

x_train <- train
summary(x_train$Source)
levels(x_train$Source)[2] <- 'Other'
for (i in 3:7) {
  levels(x_train$Source)[3] <- 'Other'
}
summary(x_train$Source)
for (j in 1:22) {
  levels(x_train$Source)[4] <- 'Other'
}
summary(x_train$Source)

如你所见,在代码中,有硬编码的部分,这是不好的。

所以,如果有更好的解决办法,非常欢迎post这里!