基于条件创建新列:修正R语言中混放的城市数据
用R语言借助参考数据集修复混放的城市列(高效处理大规模数据)
先准备示例数据方便理解场景:
# 示例数据:df1的City和Fruit列存在数据混放 df1 <- data.frame( City = c("Apple", "Beijing", "Banana", "Shanghai"), Fruit = c("Beijing", "Orange", "Shanghai", "Grape"), stringsAsFactors = FALSE ) # 城市参考数据集df2 df2 <- data.frame( City = c("Beijing", "Shanghai", "Guangzhou"), stringsAsFactors = FALSE )
方案1:用dplyr + stringr(易读,适合入门)
适合中小规模数据集,代码逻辑清晰,容易理解:
# 加载依赖包 library(dplyr) library(stringr) # 创建正确的城市列 df1 <- df1 %>% mutate( Correct_City = case_when( # 优先判断City列是否为有效城市 City %in% df2$City ~ City, # 若City列无效,判断Fruit列是否为有效城市 Fruit %in% df2$City ~ Fruit, # 都不匹配时设为NA TRUE ~ NA_character_ ) )
方案2:用data.table(高效,适合大规模数据集)
data.table采用原地修改和向量化操作,处理百万级以上数据时速度远快于基础R和dplyr:
# 加载data.table包 library(data.table) # 将数据框转换为data.table格式(可跳过,直接用data.table创建原始数据) setDT(df1) setDT(df2) # 创建正确的城市列 df1[, Correct_City := fifelse( City %in% df2$City, City, fifelse(Fruit %in% df2$City, Fruit, NA_character_) )]
关键说明
- 两种方案均采用向量化操作,避免了低效的循环,适合大规模数据处理
- 如果存在某一行City和Fruit列同时出现有效城市的情况,可以根据实际需求调整
case_when或fifelse的逻辑(比如取第一个匹配值、合并等) - 若数据量极大,可以考虑先将df2的城市列转换为哈希表,进一步提升匹配速度:
library(hash) city_hash <- hash(df2$City, df2$City) # 用哈希表匹配 df1$Correct_City <- ifelse( has.key(df1$City, city_hash), df1$City, ifelse(has.key(df1$Fruit, city_hash), df1$Fruit, NA_character_) )
内容的提问来源于stack exchange,提问作者DarkenExcalibur
相关产品推荐
相关产品推荐

