R语言data cleaning:处理State列重复/混合州名的实现方案
你之前使用的paste(unique(df$State), collapse=",")是对整列的取值去重后拼接为单个字符串,没有逐行处理State字段的内容,所以无法得到预期结果。
测试数据构造
df <- data.frame( ID = 1:6, State = c(NA, "IL", "IL,IL,IL", "OH,IL", "NM,NM,AL,AL", "FL,FL,FL") )
实现方案
方法1:tidyverse 套件实现(可读性高)
library(dplyr) library(stringr) df_clean <- df %>% # 逐行处理 rowwise() %>% mutate(State = case_when( # 保留原生NA is.na(State) ~ NA_character_, TRUE ~ { # 按逗号拆分当前行的State,取唯一值 unique_states <- unique(unlist(str_split(State, ","))) # 唯一值长度为1则返回该州名,否则返回NA if(length(unique_states) == 1) unique_states else NA_character_ } )) %>% ungroup()
方法2:Base R 实现(无需加载额外包)
df$State <- sapply(df$State, function(x) { if(is.na(x)) return(NA) unique_states <- unique(strsplit(x, ",")[[1]]) return(ifelse(length(unique_states) == 1, unique_states, NA)) })
运行上述任意一种方法后,得到的结果和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Science11
相关产品推荐
相关产品推荐

