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

时间:2016-07-26 06:42:34

标签: r r-factor

我不是R的专家...

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

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

我仍然被困住了......

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

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

尝试1

我在这里使用which,因此我不需要先将因子转换为字符。事实上,在使用which之前,我试图将因子转换为字符。结果是一样的,没有用....在这里运行代码后,没有任何改变,只是添加了另外一个名为'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级并将所有其他级别更改为“其他”?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

x_traintrain的副本。

x_train $ Source有30个级别, level1 是&#39; S122&#39; level8 是&#39; S133&#39;,我只想保留这两个级别,并将其他28个级别设置为&#39;其他&#39;。

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

Origional x_train $ Source 30个级别

S122,S123,S1​​24 ..,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)

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

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