嵌套列表多级按名称获取元素

Nested lists multiple levels get elements by name

我有一个多层嵌套列表,我想按名称提取元素。

我有一个包含许多指标的数据集。头长这样:

我为所有 Url:

检索 JSON
metrics <- lapply(dataset$Url, function(i) fromJSON(content(GET(i), as = 'text'))) 

我从 JSON 的子列表中得到

metrics_years <- lapply(metrics, function (i) i$years)

现在我有了一个三层嵌套列表。如果我这样做,我得到了我想要的一个指标:

sapply(metrics_years[["Domestic"]], '[[', 'year')

但我不能为所有的人打字。如何在不一一输入的情况下获得所有指标的相同值:

sapply(metrics_years[["Domestic"]], '[[', 'year')
sapply(metrics_years[["International"]], '[[', 'year')
...

这些文件中没有太多数据。我不确定你在期待什么。两个列表中都有名为 yearsquarters 的数据框。它们都包含日期和值。大部分内容是NA。每个都是从 1962 年开始的 time-series 数据集。您也不需要 httrfromJSON 接受 URL 作为没有 contentGET 的来源。 m <- map(1:2, ~fromJSON(d[.x], flatten = T) 其中 d 是一个包含两个 URL 的向量。我认为这就是@John Nielsen 所说的。我使用 map,但 lapply 也可以正常工作。

您正在使用括号,但您不必这样做。

library(tidyverse) # for map and ggplot
library(jsonlite)

# get the JSON data and flatten it
mm <- map(1:2, ~fromJSON(d[.x], flatten = T))

# name each list, based on the URL
names(mm) <- c("Domestic", "International") 
attributes(mm) # validate change

您可以使用环境窗格访问内容,以了解您拥有的内容。

您可以使用 $[[]] 访问内容。您可以在 [[]].

中使用数字或名称
all.equal(mm[[1]][[1]], mm$Domestic$years)
# [1] TRUE 

all.equal(mm[["Domestic"]][["years"]], mm$Domestic$years)
# [1] TRUE 

要提取数据或制作数据frame-only对象,只需将其分配给对象名称即可。

newDF <- mm$Domestic$years

不过,您不必创建新对象。如果你想绘制 Domestic years 数据框,你可以按原样使用它。

mm$Domestic$years %>% 
  mutate(year = as.integer(year), 
         value = as.numeric(value)) %>% 
  ggplot(aes(year, value)) + geom_path() + theme_bw()

Domestic quarters数据

mm$Domestic$quarters %>% 
  mutate(value = as.numeric(value)) %>% 
  ggplot(aes(seq_along(value), value)) + geom_path() +
  scale_x_continuous(labels = mm$Domestic$quarters[seq(1, 220, 50), ]$date,
                     breaks = seq(1, 220, 50)) +
  xlab("") + theme_bw()

您可以对 International 数据执行相同的操作。

mm$International$years %>% 
  mutate(year = as.integer(year),
         value = as.numeric(value)) %>% 
  ggplot(aes(year, value)) + geom_path() + theme_bw()