我有一个数据框,我希望以特定格式输出到JSON,下面有一个小样本:
dat <- structure(list(unit = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("A", "B"), class = "factor"), type = structure(c(1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("X", "Y"), class = "factor"),
date = structure(c(1357963687, 1357963869, 1357964048, 1357964230,
1357963687, 1357963942, 1357963942, 1357964123), class = c("POSIXct",
"POSIXt"), tzone = ""), latitude = c(-21.21, -21.22, -21.23,
-21.24, -21.23, -21.23, -21.23, -21.23), longitude = c(116.78,
116.77, 116.76, 116.75, 116.74, 116.75, 116.75, 116.76)), .Names = c("unit",
"type", "date", "latitude", "longitude"), row.names = c(NA, -8L
), class = "data.frame")
我将需要的JSON格式如下所示:
[{"unit":"A","type":"X","latitude":[["2013-01-12 12:08:07",-21.21],["2013-01-12 12:11:09",-21.22],["2013-01-12 12:14:08",-21.23],["2013-01-12 12:17:10",-21.24]],
"longitude":[["2013-01-12 12:08:07",116.78],["2013-01-12 12:11:09",116.77],["2013-01-12 12:14:08",116.76],["2013-01-12 12:17:10",116.75]]
},
{"unit":"B","type":"X", "latitude":[["2013-01-12 12:08:07",-21.23],["2013-01-12 12:12:22",-21.23],["2013-01-12 12:12:22",-21.23],["2013-01-12 12:15:23",-21.23]],
"longitude":[["2013-01-12 12:08:07",116.74],["2013-01-12 12:12:22",116.75],["2013-01-12 12:12:22",116.75],["2013-01-12 12:15:23",116.76]]
}]
到目前为止,我还无法操纵RJSONIO::toJSON
功能来执行此类操作,而且我没有发现文档中的示例太有用了。
我需要做些什么才能获得正确的输出?
注意:每个type
只会有一个unit
。
答案 0 :(得分:3)
您可以先将数据框转换为列表列表。例如:
> a=list(unit="A",type="X",latitude=c(1,2,3),longitude=c(4,5,6))
> b=list(unit="B",type="Y",latitude=c(11,22,33),longitude=c(43,54,65))
> dlist = list(a,b)
> cat(toJSON(dlist))
[
{
"unit": "A",
"type": "X",
"latitude": [ 1, 2, 3 ],
"longitude": [ 4, 5, 6 ]
},
{
"unit": "B",
"type": "Y",
"latitude": [ 11, 22, 33 ],
"longitude": [ 43, 54, 65 ]
}
]
问题实际上是如何将数据框操作为正确的格式。
然而,你的JSON输出在向量中有混合类型 - 字符和数字 - ["2013-01-12 12:08:07",-21.23]
,我不知道如何从R中得到那些坚持向量为单一类型的东西。 ["2013-01-12 12:08:07","-21.23"]
会被接受吗?如果是这样,请继续阅读......
plyr
包有很多用于拆分和操作数据框和列表的代码。例如:
dlply(dat,~unit)
将按unit
变量拆分数据框。您可以将函数应用于每个部分并返回列表。这个功能:
make1 <- function(d){
list(
unit=d$unit[1],
type=d$type[1],
latitude=cbind(as.character(d$date),d$latitude),
longitude=cbind(as.character(d$date),d$longitude))
}
应将一个部分转换为正确的列表格式。因此,请dlply
对每个部分执行此操作,并返回列表列表。该列表具有名称,这使toJSON
输出为命名数组 - 我们需要删除名称以获取JS列表。
> L = dlply(dat,~unit,make1)
> names(L)=NULL
> cat(toJSON(L))
[
{
"unit": "A",
"type": "X",
"latitude": [ [ "2013-01-12 04:08:07", "-21.21" ],
[ "2013-01-12 04:11:09", "-21.22" ],
[ "2013-01-12 04:14:08", "-21.23" ],
[ "2013-01-12 04:17:10", "-21.24" ] ],
"longitude": [ [ "2013-01-12 04:08:07", "116.78" ],
[ "2013-01-12 04:11:09", "116.77" ],
[ "2013-01-12 04:14:08", "116.76" ],
[ "2013-01-12 04:17:10", "116.75" ] ]
},
{
"unit": "B",
"type": "Y",
"latitude": [ [ "2013-01-12 04:08:07", "-21.23" ],
[ "2013-01-12 04:12:22", "-21.23" ],
[ "2013-01-12 04:12:22", "-21.23" ],
[ "2013-01-12 04:15:23", "-21.23" ] ],
"longitude": [ [ "2013-01-12 04:08:07", "116.74" ],
[ "2013-01-12 04:12:22", "116.75" ],
[ "2013-01-12 04:12:22", "116.75" ],
[ "2013-01-12 04:15:23", "116.76" ] ]
}
]
有趣吗?