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

问题描述 投票:0回答:2

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

在我的训练数据中,有一个名为Source的领域有30个级别,我只想保持前2个级别,因为他们是大多数,并且需要将所有其他28个级别更改为“其他”。通过这种方式,我以后可以更轻松地应用One-Hot Encoding。

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

我仍然被卡住了......

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

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

试试1

这里我使用的是which,因此我不需要先将因子转换为字符。事实上,在使用which之前,我试图将因子转换为字符。结果是一样的,没有用....在这里运行代码后,没有任何改变,只是添加了1个更多级别称为“其他”...

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()be这样的方法,因为有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级并将所有其他级别更改为“其他”?

r r-factor
2个回答
1
投票

这不是一个可重复的示例,因为您不提供数据,但假设您的因素是火车的一部分,您可以使用。

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

现在,假设我想重新考虑这样的因素,即最高的两个因素在一个类中,而其他因素在另一个类中。我不需要任何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

0
投票

最后,我解决了这个问题,但解决方案不是很聪明。因此,如果有更好的解决方案可以解决这个问题,请随时在此处发布。

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

x_traintrain的副本。

x_train $ Source有30个级别,level1是'S12​​2',level8是'S133',我只想保留这2个级别并将其他28个级别设置为'Other'。

如果您仍不清楚此描述,请参阅以下示例:

原始x_train $ Source 30个级别

S122,S123,S1​​24 ..,S133,S134,....

最终的x_train $ Source级别

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)

正如您所看到的,在代码中,存在硬编码部分,这是不好的。

所以,如果有更好的解决方案,非常欢迎在此发布!

© www.soinside.com 2019 - 2024. All rights reserved.