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

如何匹配数据框AREA列与DEVICE_HOME_AREA列JSON字符串中的键并取值?

解决方案:从JSON字符串中匹配并提取对应值

这里提供两种可行的R语言解决方案,针对你描述的非规整数据框处理需求:


方法1:使用jsonlite解析JSON(规范可靠)

这种方法先将每行的JSON字符串解析为R的命名向量,再通过匹配键名提取对应值,适合JSON格式严格的场景:

# 加载所需包
library(jsonlite)
library(dplyr)

# 逐行处理数据框
TX_JAN_2019_DF <- TX_JAN_2019_DF %>%
  rowwise() %>%
  mutate(
    # 将数值型AREA转为字符(JSON键为字符串类型)
    area_str = as.character(AREA),
    # 解析JSON字符串为命名向量
    home_area_vec = fromJSON(DEVICE_HOME_AREA),
    # 提取匹配值,不存在则返回NA
    matched_value = ifelse(area_str %in% names(home_area_vec), 
                          home_area_vec[[area_str]], 
                          NA)
  ) %>%
  # 移除临时辅助列(可选)
  select(-area_str, -home_area_vec)

关键说明:

  • rowwise()确保按行独立处理每条数据
  • fromJSON()将单行JSON字符串转为键值对形式的命名向量
  • 通过names(home_area_vec)检查当前行AREA是否存在于JSON键中,匹配成功则提取对应数值

方法2:使用正则表达式(高效快速)

如果你的JSON格式固定(键为数字字符串、值为整数),可以直接用正则匹配提取,无需完整解析JSON,适合大数据量场景:

library(dplyr)
library(stringr)

TX_JAN_2019_DF <- TX_JAN_2019_DF %>%
  mutate(
    # 动态生成匹配当前行AREA的正则表达式
    pattern = str_c('"', as.character(AREA), '":(\\d+)'),
    # 提取匹配到的数字,无匹配则返回NA
    matched_value = str_extract(DEVICE_HOME_AREA, pattern) %>%
      str_replace(pattern, "\\1") %>%
      as.numeric()
  ) %>%
  # 移除临时辅助列(可选)
  select(-pattern)

关键说明:

  • str_c()生成的正则会精准匹配"目标AREA值":数字的格式
  • str_extract()提取整段匹配内容,str_replace()仅保留括号内的数字部分
  • 最终转为数值类型,无匹配项时自动返回NA

测试验证

用你提供的第一行数据测试:

  • AREA值:481210216382
  • DEVICE_HOME_AREA字符串:"{\"481210216382\":307,\"481210216371\":50,...}"

两种方法都会成功提取到307;若某行AREA未出现在对应JSON中,结果会返回NA。

内容的提问来源于stack exchange,提问作者RoninUTA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:10:18