R:将具有不同数量项目的列表列表转换为数据框
R: Convert list of lists with varying number of items to dataframe
List-to-dataframe 已经被广泛讨论 here 但我找不到一个非常简单的问题的解决方案:一个包含不同数量项目的列表列表。
这是列表
require(json)
hdi <- fromJSON(file="http://data.undp.org/resource/y8j2-3vi9.json")
列表中的第一个列表是
hdi[1]
[[1]]
[[1]]$`_2011_hdi_value`
[1] "0.887"
[[1]]$`_1990_hdi_value`
[1] "0.798"
[[1]]$`_2000_2013_average_annual_hdi_growth`
[1] "0.37"
[[1]]$`_1980_hdi_value`
[1] "0.757"
[[1]]$`_2010_hdi_value`
[1] "0.885"
[[1]]$`_2008_hdi_value`
[1] "0.879"
[[1]]$`_1990_2000_average_annual_hdi_growth`
[1] "0.62"
[[1]]$`_2012_hdi_value`
[1] "0.889"
[[1]]$`_2013_hdi_value`
[1] "0.890"
[[1]]$`_2005_hdi_value`
[1] "0.870"
[[1]]$`_2000_hdi_value`
[1] "0.849"
[[1]]$country
[1] "Very high human development"
[[1]]$`_1980_1990_average_annual_hdi_growth`
[1] "0.52"
但列表中的项目数量不同
summary(as.numeric(summary(hdi)[,"Length"]))
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 5.00 16.00 16.00 14.93 16.00 16.00
我想构建一个包含 16 列的数据框,其中 NA
指示该列表的缺失值。
最简单的是
data <- jsonlite::fromJSON("http://data.undp.org/resource/y8j2-3vi9.json")
或者,使用 rlist
library(rlist)
data <- list.stack(hdi, fill=TRUE)
你可以试试这个:
require(RJSONIO)
hdi <- fromJSON("http://data.undp.org/resource/y8j2-3vi9.json")
#get the unique values of the column names
columnnames<-unique(unlist(lapply(hdi,names)))
#subset each element of the list with and rbind them together
res<-do.call(rbind,lapply(hdi,function(x) x[columnnames]))
colnames(res)<-columnnames
从那里,您可以强制转换数字列并将对象强制转换为 data.frame
。我建议您使用 RJSONIO
库来处理转换 from/to json 因为根据我的经验,它似乎更可靠。
List-to-dataframe 已经被广泛讨论 here 但我找不到一个非常简单的问题的解决方案:一个包含不同数量项目的列表列表。
这是列表
require(json)
hdi <- fromJSON(file="http://data.undp.org/resource/y8j2-3vi9.json")
列表中的第一个列表是
hdi[1]
[[1]]
[[1]]$`_2011_hdi_value`
[1] "0.887"
[[1]]$`_1990_hdi_value`
[1] "0.798"
[[1]]$`_2000_2013_average_annual_hdi_growth`
[1] "0.37"
[[1]]$`_1980_hdi_value`
[1] "0.757"
[[1]]$`_2010_hdi_value`
[1] "0.885"
[[1]]$`_2008_hdi_value`
[1] "0.879"
[[1]]$`_1990_2000_average_annual_hdi_growth`
[1] "0.62"
[[1]]$`_2012_hdi_value`
[1] "0.889"
[[1]]$`_2013_hdi_value`
[1] "0.890"
[[1]]$`_2005_hdi_value`
[1] "0.870"
[[1]]$`_2000_hdi_value`
[1] "0.849"
[[1]]$country
[1] "Very high human development"
[[1]]$`_1980_1990_average_annual_hdi_growth`
[1] "0.52"
但列表中的项目数量不同
summary(as.numeric(summary(hdi)[,"Length"]))
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 5.00 16.00 16.00 14.93 16.00 16.00
我想构建一个包含 16 列的数据框,其中 NA
指示该列表的缺失值。
最简单的是
data <- jsonlite::fromJSON("http://data.undp.org/resource/y8j2-3vi9.json")
或者,使用 rlist
library(rlist)
data <- list.stack(hdi, fill=TRUE)
你可以试试这个:
require(RJSONIO)
hdi <- fromJSON("http://data.undp.org/resource/y8j2-3vi9.json")
#get the unique values of the column names
columnnames<-unique(unlist(lapply(hdi,names)))
#subset each element of the list with and rbind them together
res<-do.call(rbind,lapply(hdi,function(x) x[columnnames]))
colnames(res)<-columnnames
从那里,您可以强制转换数字列并将对象强制转换为 data.frame
。我建议您使用 RJSONIO
库来处理转换 from/to json 因为根据我的经验,它似乎更可靠。