You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件创建新列:修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:10:46