如何匹配数据框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
相关产品推荐
相关产品推荐

