如何用jsonlite或正则获取JSON中period为0m的strongBuy值?
嗨,这个问题我碰到过!核心原因是你把整个JSON结构unlist之后,同名的strongBuy键会被自动添加后缀(比如.1、.2),但你直接用原始键名查找就会找不到对应的值,返回NA。下面给你几个靠谱的解决办法:
方法一:直接操作嵌套结构(最推荐)
别着急unlist,fromJSON解析后的结果本身就是嵌套的数据结构,我们可以直接筛选出period为0m的条目,再提取strongBuy的值:
library(jsonlite) library(dplyr) i <- "MSFT" json_object <- getURL(json_url) quote_summary <- fromJSON(json_object) # 定位到recommendationTrend的trend数据框,筛选period为0m的行,提取strongBuy strongBuy_0m <- quote_summary$quoteSummary$result[[1]]$recommendationTrend$trend %>% filter(period == "0m") %>% pull(strongBuy) %>% as.numeric() print(strongBuy_0m)
这里trend是一个标准的数据框,用dplyr的filter和pull就能精准拿到你要的值,完全不会受其他period条目的干扰。
方法二:如果一定要用unlist后的结构
如果你因为某些原因必须保留unlist的步骤,可以先找到period为0m的条目在数组中的位置,再对应提取strongBuy的键:
library(jsonlite) i <- "MSFT" json_object <- getURL(json_url) quote_summary <- fromJSON(json_object) quote_summary_unlist <- unlist(quote_summary) # 先找到period为0m的条目索引 trend_df <- quote_summary$quoteSummary$result[[1]]$recommendationTrend$trend target_index <- which(trend_df$period == "0m") # 拼接对应的键名,提取值 target_key <- paste0("quoteSummary.result.recommendationTrend.trend.strongBuy", target_index) strongBuy_0m <- as.numeric(unname(quote_summary_unlist[target_key])) print(strongBuy_0m)
方法三:用正则表达式辅助(不推荐,仅作参考)
正则表达式可以用来匹配unlist后的键名,但因为unlist后的键名后缀是按数组顺序生成的,不如直接操作数据框可靠,不过也可以试试:
library(jsonlite) i <- "MSFT" json_object <- getURL(json_url) quote_summary <- fromJSON(json_object) quote_summary_unlist <- unlist(quote_summary) # 先找到所有包含strongBuy的键,再结合period的位置匹配 trend_df <- quote_summary$quoteSummary$result[[1]]$recommendationTrend$trend target_index <- which(trend_df$period == "0m") strongBuy_keys <- grep("strongBuy", names(quote_summary_unlist), value = TRUE) target_key <- strongBuy_keys[target_index] strongBuy_0m <- as.numeric(unname(quote_summary_unlist[target_key])) print(strongBuy_0m)
总的来说,方法一是最清晰、最不容易出错的,直接利用解析后的嵌套数据结构进行筛选,完全避开了unlist带来的键名冲突问题。
内容的提问来源于stack exchange,提问作者user9532692
相关产品推荐
相关产品推荐

