使用dplyr处理因子水平:替换点号后出现NA的问题咨询
问题分析与解决方案
嘿,我知道你为啥遇到这个NA问题啦!咱们先拆解下你的sandwich2写法哪里出了问题:
当你写factor(sandwich_factor, levels = str_replace_all(levels(sandwich_factor), "\\.", " "))的时候,你只是修改了因子的水平标签名称,但原列sandwich_factor里的每个元素值还是原来带点的字符串(比如"mustard.sauce")。而新的levels里只有替换后的"mustard sauce",R找不到"mustard.sauce"对应的新水平,自然就返回NA了。
要实现「保留factor类型+维持原水平顺序+替换点为空格」的需求,有两种简单的解决办法:
方法一:先转字符处理,再重新生成因子
先把因子转成字符串替换点号,再用替换后的原水平顺序重新生成因子,这样元素值和新levels能一一对应:
library(tidyverse) library(stringr) sandwich <- c("bread", "mustard.sauce", "tuna.fish", "lettuce", "bread") sandwich_df <- data_frame(sandwich_str = sandwich) %>% mutate(sandwich_factor = factor(sandwich)) %>% # 正确的sandwich2写法 mutate(sandwich2 = factor( str_replace_all(as.character(sandwich_factor), "\\.", " "), levels = str_replace_all(levels(sandwich_factor), "\\.", " ") )) %>% mutate(sandwich3 = str_replace_all(sandwich_str, "\\.", " ")) print(sandwich_df)
方法二:直接修改因子的levels属性(更高效)
如果不想转来转去,可以直接修改现有因子的levels标签,这种方法不会改变因子的内部编码,效率更高,尤其适合大数据框:
sandwich_df <- data_frame(sandwich_str = sandwich) %>% mutate(sandwich_factor = factor(sandwich)) %>% mutate(sandwich2 = sandwich_factor) %>% # 直接替换levels的标签 mutate(sandwich2 = `levels<-`(sandwich2, str_replace_all(levels(sandwich2), "\\.", " "))) %>% mutate(sandwich3 = str_replace_all(sandwich_str, "\\.", " ")) print(sandwich_df)
验证结果
两种方法跑出来的sandwich2都会是factor类型,内容和sandwich3完全一致,同时保留原因子的水平顺序:
# A tibble: 5 × 4 sandwich_str sandwich_factor sandwich2 sandwich3 <chr> <fct> <fct> <chr> 1 bread bread bread bread 2 mustard.sauce mustard.sauce mustard sauce mustard sauce 3 tuna.fish tuna.fish tuna fish tuna fish 4 lettuce lettuce lettuce lettuce 5 bread bread bread bread
内容的提问来源于stack exchange,提问作者ohnoplus
相关产品推荐
相关产品推荐

