我有以下列表:中提取多個列,並保存在data.frame
library(rjson)
j <- fromJSON(file='https://esgf-data.dkrz.de/esg-search/search/?offset=0&limit=1000&type=Dataset&replica=false&latest=true&project=CORDEX&domain=EUR-11&experiment=rcp85&time_frequency=day&facets=rcm_name%2Cproject%2Cproduct%2Cdomain%2Cinstitute%2Cdriving_model%2Cexperiment%2Cexperiment_family%2Censemble%2Crcm_version%2Ctime_frequency%2Cvariable%2Cvariable_long_name%2Ccf_standard_name%2Cdata_node&format=application%2Fsolr%2Bjson')
我很感興趣,從這個成分提取數據:j$response$docs
,這是一個列表的列表。 '內部'列表都應該有相同的名稱。
我想將輸出保存到data.frame()
或tibble()
。
這下面的作品,並給出了所需的輸出,對幾個選定的變量:
nmod <- length(j$response$docs)
for (i in 1:nmod) {
#select one list at a time
j1 <- j$response$docs[[i]]
tmp <- data.frame(variable=j1$variable,
variable_long_name=j1$variable_long_name,
rcm_name=j1$rcm_name,
driving_model=j1$driving_model,
cf_standard_name=j1$cf_standard_name
)
#join them
if (i==1) {
d <- tmp
} else {
d <- rbind(d, tmp)
}
}
不過,我想知道是否有一個更優雅的和有效的方式,也許用tidyr
,dplyr
或purrr
,這也允許我選擇所有的「列」,而不僅僅是那裏選擇的幾個。
將列表綁定在一起可以通過使用來自'dplyr'的'bind_rows'進行整理,該列表需要列表。它可以移到循環之外,你不需要if語句。 – Lespied
你也許可以用'lapply(,'[[')''來提取第一個列表 – Lespied
@Lespied然而,我認爲這不適用於多個內部列表,對吧?我的意思是,我可以用lapply(j $ response $ docs,'[[','variable_long_name')'一次提取一個,但一次只能提取一個。我錯過了一個簡單的方法來做到這一點? – AF7