我正在用jsonlite 加载此JSON数据
<snip>
"rawData": {
"fortune": {},
"plaintext": {},
"db": {},
"update": {
"duda": [
{
"latencyAvg": "201.40us",
"latencyMax": "727.00us",
"latencyStdev": "54.85us",
"totalRequests": 561810,
"startTime": 1413890149,
"endTime": 1413890164
}
]
},
"json": {
"duda": [
{
"latencyAvg": "201.40us",
"latencyMax": "727.00us",
"latencyStdev": "54.85us",
"totalRequests": 561810,
"startTime": 1413890149,
"endTime": 1413890164
}
]
},
"query": {}
}
这导致了具有嵌套数据帧的结构
data <- structure(list(fortune = structure(list(), .Names = character(0)),
plaintext = structure(list(), .Names = character(0)), db = structure(list(), .Names = character(0)),
update = structure(list(duda = structure(list(latencyAvg = "201.40us",
latencyMax = "727.00us", latencyStdev = "54.85us", totalRequests = 561810L,
startTime = 1413890149L, endTime = 1413890164L), .Names = c("latencyAvg",
"latencyMax", "latencyStdev", "totalRequests", "startTime",
"endTime"), class = "data.frame", row.names = 1L)), .Names = "duda"),
json = structure(list(duda = structure(list(latencyAvg = "201.40us",
latencyMax = "727.00us", latencyStdev = "54.85us", totalRequests = 561810L,
startTime = 1413890149L, endTime = 1413890164L), .Names = c("latencyAvg",
"latencyMax", "latencyStdev", "totalRequests", "startTime",
"endTime"), class = "data.frame", row.names = 1L)), .Names = "duda"),
query = structure(list(), .Names = character(0))), .Names = c("fortune",
"plaintext", "db", "update", "json", "query"))
我想创建一个看起来像这样的单一数据帧:
Type | Name | latencyAvg | latencyMax | latencyStdev | totalRequests | startTime | endTime
json | duda | 201.40us | <etc..>
update | duda | 201.40us | <etc..>
通过扁平化嵌套的数据帧。我正在想办法手动做到这一点,删除我想要的项目,并使用rbind/cbind将它们移动到一个新的数据帧中,但有没有一种简单的方法可以实现这种类型的递归扁平化?
使用flatten
函数。它获取一个数据帧并返回一个平面数据帧。如果需要从源数据帧中排除某些列,则使用df[[-i]]
排除列i
。
假设对象被命名为"data"的不幸名称:
newdat <- rbind.data.frame( Type= c(rep("json", nrow(data$json$duda)),
rep("update", nrow(data$update$duda)) ),
rbind( data$json$duda, data$update$duda) )
另一个oneliner
do.call(rbind, lapply(data[c('json', 'update')], '[[', 'duda'))