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_train
是 train
的副本。
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这里!
我不是 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_train
是 train
的副本。
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这里!