在R语言中仅对分类变量执行unclass处理并调整编码的方法求助
解决方案:仅对指定列进行0起始编码
我来帮你搞定这个问题!你需要的是只把Restaurant列从字符型转为从0开始的数字编码,同时保留isHot和isCrispy的原始数值,对吧?之前用sapply(unclass)的问题在于它会把所有列都统一处理,导致数值列也被修改,我们只需要针对性操作Restaurant列就行。
方法1:使用dplyr(推荐,符合你习惯的管道语法)
因为你已经在使用管道符%>%,用dplyr的mutate函数可以轻松修改单列:
library(dplyr) # 先构造你的原始数据框 df <- tibble( isHot = c(1, 0, 1, 0), isCrispy = c(0, 0, 1, 0), Restaurant = c("A", "B", "B", "C") ) # 转换Restaurant列 df_transformed <- df %>% mutate(Restaurant = as.integer(factor(Restaurant)) - 1)
- 原理:
factor(Restaurant)把字符转为因子,默认按字母顺序分配水平(A→1,B→2,C→3); as.integer()提取因子的编码值,再减1就得到0、1、2的结果;- 其他列完全保持原始数值不变。
方法2:Base R(无需额外包)
如果不想加载dplyr,直接用基础R修改列即可:
# 原始数据框 df <- data.frame( isHot = c(1, 0, 1, 0), isCrispy = c(0, 0, 1, 0), Restaurant = c("A", "B", "B", "C"), stringsAsFactors = FALSE ) # 转换Restaurant列 df$Restaurant <- as.integer(factor(df$Restaurant)) - 1
进阶:按数据出现顺序编码(而非字母顺序)
如果你的Restaurant列需要按数据中首次出现的顺序编码(而不是固定字母顺序),可以指定因子的levels参数:
df_transformed <- df %>% mutate(Restaurant = as.integer(factor(Restaurant, levels = unique(Restaurant))) - 1)
这样不管后续数据中Restaurant的字符顺序如何,都会按它在数据里第一次出现的顺序分配0、1、2的编码。
运行以上代码后,你就能得到想要的结果:
| isHot | isCrispy | Restaurant |
|---|---|---|
| 1 | 0 | 0 |
| 0 | 0 | 1 |
| 1 | 1 | 1 |
| 0 | 0 | 2 |
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

