在R中编写JSON子代

时间:2013-05-01 14:04:24

标签: json r

我有一个我想用JSON分组的数据集。

                       address         city.x state.x latitude.x longitude.x
    1 5601 W. Slauson Ave. #200    Culver City      CA   33.99718  -118.40145
    2                 PO 163005         Austin      TX   30.31622   -97.85877
    3 10215 W. Jamesburg Street        Wichita      KS   37.70063   -97.43430
    4         14556 Newport Ave         Tustin      CA   33.74165  -117.82127
    5      2496 Falcon Crescent Virginia Beach      VA   36.83840   -76.02862
    6   1306 Wilshire Boulevard   Santa Monica      CA   34.03216  -118.49022

我想将地址和纬度/长度组合在一起并将其全部归入公司类别。

我希望它看起来像这样:

     {company: {address: {address:  "5601 W. Slauson Ave. #200" ,
                          city.x:  "Culver City" ,
                          state.x:  "CA"}},
               {geo: {latitude: "33.99718",
                      longitude: "-118.40145"}}},

     {company: {address: {address:  "PO 163005" ,
                          city.x:  "Austin" ,
                          state.x:  "TX"}},
               {geo: {latitude: "30.31622",
                      longitude: "-97.85877"}}},



    structure(list(address = c("5601 W. Slauson Ave. #200", "PO 163005", 
    "10215 W. Jamesburg Street", "14556 Newport Ave", "2496 Falcon Crescent", 
    "1306 Wilshire Boulevard"), city.x = c("Culver City", "Austin", 
    "Wichita", "Tustin", "Virginia Beach", "Santa Monica"), state.x = c("CA", 
    "TX", "KS", "CA", "VA", "CA"), latitude.x = c(33.997179, 30.316223, 
    37.700632, 33.741651, 36.838398, 34.032159), longitude.x = c(-118.40145, 
    -97.85877, -97.4343, -117.82127, -76.02862, -118.49022)), .Names = c("address", 
    "city.x", "state.x", "latitude.x", "longitude.x"), class = "data.frame", row.names = c(NA, 
    6L))

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

以下代码应输出您想要的内容:

for (i in 1:nrow(df)){
  cat ("{company:{address:{adress:\t\"",df$address[i],
       "\",\n\t\tcity.x:\t\"", df$city.x[i],
       "\",\n\t\tstate.x:\t \"", df$state.x[i],
       "\"}}\n\t {geo:{\tlatitude: \"", df$latitude[i],
       "\",\n\t\tlongitude: \"", df$longitude[i],
       "\"}}},\n", sep="")
}

df作为您的数据框。

答案 1 :(得分:0)

另一种选择是使用rjson包。

require(rjson)
# This is necessary to avoid duplication of labels in the JSON output
names(df) <- NULL

reshaped <- apply(df, 1, FUN=function(x){list(address=list(
                                                  address = x[1],
                                                  city = x[2],
                                                  state = x[3]),
                                            coords=list(
                                                  latitude = x[4],
                                                  longitude = x[5]))})
result <- toJSON(reshaped)

与您要求的唯一区别在于,它不是以“公司”为根,而是具有序号。您可以通过更改数据的行名称来更改它(使用rownames),但R不支持重复的行名...我得到的最接近的是

rownames(df) <- paste("company", 1:nrow(df), collapse="")

并且可能使用一点regexp魔法你可以删除输出字符串中的数字......