嵌套列表多级按名称获取元素
Nested lists multiple levels get elements by name
我有一个多层嵌套列表,我想按名称提取元素。
我有一个包含许多指标的数据集。头长这样:
Metric
Url
Domestic
https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/njiq/ukea/data
International
https://www.ons.gov.uk/economy/grossvalueaddedgva/timeseries/abml/pn2/data
我为所有 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')
...
这些文件中没有太多数据。我不确定你在期待什么。两个列表中都有名为 years
和 quarters
的数据框。它们都包含日期和值。大部分内容是NA。每个都是从 1962 年开始的 time-series 数据集。您也不需要 httr
。 fromJSON
接受 URL 作为没有 content
或 GET
的来源。 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()
我有一个多层嵌套列表,我想按名称提取元素。
我有一个包含许多指标的数据集。头长这样:
Metric | Url |
---|---|
Domestic | https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/njiq/ukea/data |
International | https://www.ons.gov.uk/economy/grossvalueaddedgva/timeseries/abml/pn2/data |
我为所有 Url:
检索 JSONmetrics <- 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')
...
这些文件中没有太多数据。我不确定你在期待什么。两个列表中都有名为 years
和 quarters
的数据框。它们都包含日期和值。大部分内容是NA。每个都是从 1962 年开始的 time-series 数据集。您也不需要 httr
。 fromJSON
接受 URL 作为没有 content
或 GET
的来源。 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()