R - 将数据帧转换为json

时间:2018-03-11 05:28:56

标签: json r dataframe

我想将以下数据框转换为JSON,但我不知道如何实现它。我试图在网上找到一些帮助,但看起来没有人在r数据帧上做过。

df<-data.frame(profileKey=c(7,7,7,8,8,8),joinDate=c('2007-11-01','2007-11-
01','2007-11-01','1993-01-04','1993-01-04','1993-01-04'),Year=c('2013','2014','2015','2013','2014','2015'),monthlySalary=c('2000','3251','2015','4355','1112','33223'),event=c(0,0,0,0,0,1))

我想要的输出是:

{

"7": {
    "Profile_key": 7,
    "Join.Date": "2007-11-01",
    "event": {
        "2013": "0",
        "2014": "0",
        "2015": "0"
    },
    "monthly_salary": {
        "2013": 2000,
        "2014": 3251,
        "2015": 2015
    }
},
"8": {
    "Profile_key": 8,
    "Join.Date": "1993-01-04",
    "event": {
        "2013": "0",
        "2014": "0",
        "2015": "1"
    },
    "monthly_salary": {
        "2013": 4355,
        "2014": 1112,
        "2015": 33223
    }
}
}
  

注意:有一个类似的问题convert data frame to json但不完全相同。我的问题解决了嵌套jsons的问题,基本上是如何以某些变量的时间序列形式生成数据。这需要额外的数据争论,而不仅仅是将其提供给toJson()函数。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

正如其他人在评论中建议的那样,为了将R对象转换为JSON,可以使用jsonlite :: toJSON函数。

在我看来,你的问题是正确格式化R对象以获得所需的输出。

显然,有一些业务逻辑可以确定json中每个对象的内容。我已经定义了一个简单的函数来将数据框转换为列表,如果你想要更改逻辑,那么你可能想要编辑它。

希望这有帮助。

df <- data.frame(
  profileKey=c(7,7,7,8,8,8)
  , joinDate=c('2007-11-01','2007-11-01','2007-11-01'
               ,'1993-01-04','1993-01-04','1993-01-04')
  , Year=c('2013','2014','2015','2013','2014','2015')
  , monthlySalary= as.numeric(c('2000','3251','2015','4355','1112','33223'))
  , event=c(0,0,0,0,0,1)
  , stringsAsFactors = FALSE)


convert_groupings <- function(key_df){

  key_df <- as.list(key_df)

  key_df$profileKey <- unique(key_df$profileKey)
  key_df$joinDate <- unique(key_df$joinDate)

  names(key_df$event) <- names(key_df$monthlySalary) <- key_df$Year
  key_df$Year <- NULL

  key_df$event <- as.list(key_df$event)
  key_df$monthlySalary <- as.list(key_df$monthlySalary)

  key_df
}


df_list <- split(df, f = df$profileKey)
df_list <- lapply(df_list, convert_groupings)

cat(
  jsonlite::toJSON(
    df_list
    , auto_unbox = T
    , pretty = T
  )
)