我遇到了一个非常讨厌的嵌套JSON的问题.
格式是这样的
{
"matches": [
{
"matchId": 1,
"region": "BR",
"participants": [
{
"participantId": 0,
"teamId": 200,
"stats": {
"winner": true,
"champLevel": 16,
"item0": 3128,
}
{
"matchId": 2,
"region": "BR",
"participants": [
{
"participantId": 0,
"teamId": 201,
"stats": {
"winner": false,
"champLevel": 18,
"item0": 3128,
"item1": 3157,
"item1": 3158,
}
Run Code Online (Sandbox Code Playgroud)
正如您在第二场比赛中看到的那样,项目数量增加了,但在数据框架中第一行将具有相同的列:
MatchId region ... stats.winner stats.champLevel stats.item0 stats.item1 stats.item2
1 BR TRUE 16 3128 1 BR
1 BR TRUE 16 3128 3157 3158
Run Code Online (Sandbox Code Playgroud)
看第一行小于第二行,所以R回收值....
如果您想要完整的数据,可以访问:http: //pastebin.com/HQDf2ase
我如何将json解析为data.frame:
json.matchData <- fromJSON(file="file.json"))
Run Code Online (Sandbox Code Playgroud)
matchData.i <- lapply(json.matchData$matches, function(x){ unlist(x)})
Run Code Online (Sandbox Code Playgroud)
matchData <- do.call("rbind", matchData.i)
matchData <- as.data.frame(matchData)
Run Code Online (Sandbox Code Playgroud)
但是数据帧搞砸了,因为有些字段应该是NA但是它们填充了错误的值.
我认为在plyr rbind.fill()这里使用该功能会有所帮助。这个怎么样
library(plyr)
matchData <- rbind.fill(lapply(matchData.i,
function(x) do.call("data.frame", as.list(x))
))
Run Code Online (Sandbox Code Playgroud)
该lapply()位是把中间列表分成data.frames其中rbind.fill需要。