我不是R的专家...
在我的训练数据中,有一个名为Source
的字段有30个级别,我只想保留前2个级别,因为它们占多数,并且需要将所有其他28个级别更改为'其他'。通过这种方式,我以后可以更轻松地应用One-Hot Encoding。
我在此检查了解决方案:Solution 1和Solution 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级并将所有其他级别更改为“其他”?
答案 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_train
是train
的副本。
x_train $ Source有30个级别, level1 是&#39; S122&#39; level8 是&#39; S133&#39;,我只想保留这两个级别,并将其他28个级别设置为&#39;其他&#39;。
如果您仍然不清楚此描述,请参阅以下示例:
Origional x_train $ Source 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)
正如您所看到的,在代码中,存在硬编码部分,这是不好的。
所以,如果有更好的解决方案,非常欢迎在此发布!