我不是R的专家......
在我的训练数据中,有一个名为Source
的领域有30个级别,我只想保持前2个级别,因为他们是大多数,并且需要将所有其他28个级别更改为“其他”。通过这种方式,我以后可以更轻松地应用One-Hot Encoding。
我在这里检查了解决方案:Solution 1和Solution 2
我仍然被卡住了......
以下是我尝试的主要解决方案:
train
是原始的训练数据,x_train
只是一个副本。 Source
是一个因子变量。前2个级别是'S122',它是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级并将所有其他级别更改为“其他”?
这不是一个可重复的示例,因为您不提供数据,但假设您的因素是火车的一部分,您可以使用。
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
最后,我解决了这个问题,但解决方案不是很聪明。因此,如果有更好的解决方案可以解决这个问题,请随时在此处发布。
让我们回想一下我在问题中提到的主要部分:
x_train
是train
的副本。
x_train $ Source有30个级别,level1是'S122',level8是'S133',我只想保留这2个级别并将其他28个级别设置为'Other'。
如果您仍不清楚此描述,请参阅以下示例:
原始x_train $ Source 30个级别
S122,S123,S124 ..,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)
正如您所看到的,在代码中,存在硬编码部分,这是不好的。
所以,如果有更好的解决方案,非常欢迎在此发布!