代码之家  ›  专栏  ›  技术社区  ›  dondapati

R: 无法从数据帧在键值对中生成输出

  •  0
  • dondapati  · 技术社区  · 7 年前

    map 具有的数据 keys and values . 但我面临着转换它的问题,我已经尝试了以下代码,但我不能满足我的要求。我需要如下图所示的数据

    > df <- data.frame( sec = c('15:31:36',"15:31:37",'15:31:37','15:31:37','15:31:38','15:31:39'), 
                       label = c("Choose to and fro flights","Choose to and fro flights","Details","Details","Details","Details"), 
                       responseCode = c(200,200,200,'Non HTTP response code: org.apache.http.NoHttpResponseException','200','200'), 
                       Counting = c(9,1,2,2,5,1))
    
    > purList1 <- lapply(split(df, df$label), function(x) split(x, x$responseCode,drop = T))
    
    > output <- toJSON(
               list( ResponseCode = 
              lapply(names(purList1),function(x){
                    ss = purList1[[x]]
                    tt = lapply(names(ss),function(y){                       
                       items = ss[[y]][c("sec","Counting")]
                       sub = data.frame( R_C_seconds = as.vector(items$sec),
                                           R_C_Count = as.vector(items$Counting)
                       )
    
                      c(as.vector(unlist(data.frame(y))), as.vector(sub))
                   }) 
    
                  c(as.vector(x),  as.vector(tt))
               })
     )
     ,pretty = T)
    

    上述代码的通用Optput:

    {
      "ResponseCode": [
        [
          ["Choose to and fro flights"],
          {
            "1": ["200"],
            "R_C_seconds": ["15:31:36", "15:31:37"],
            "R_C_Count": [9, 1]
          }
        ],
        [
          ["Details"],
          {
            "1": ["200"],
            "R_C_seconds": ["15:31:37", "15:31:38", "15:31:39"],
            "R_C_Count": [2, 5, 1]
          },
          {
            "1": ["Non HTTP response code: org.apache.http.NoHttpResponseException"],
            "R_C_seconds": ["15:31:37"],
            "R_C_Count": [2]
          }
        ]
      ]
    } 
    

    但我不包括json输出 以下指定的格式键值对。

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   yutannihilation    7 年前

    您的代码似乎过于复杂。人们很容易被列表树搞糊涂。请不要尝试处理整个 purList1 同时播放子集,如 purList1[[1]] 第一


    reprex::reprex_info()
    #> Created by the reprex package v0.1.1.9000 on 2017-11-18
    
    df <- data.frame( sec = c('15:31:36',"15:31:37",'15:31:37','15:31:37','15:31:38','15:31:39'), 
                      label = c("Choose to and fro flights","Choose to and fro flights","Details","Details","Details","Details"), 
                      responseCode = c(200,200,200,'Non HTTP response code: org.apache.http.NoHttpResponseException','200','200'), 
                      Counting = c(9,1,2,2,5,1))
    
    purList1 <- lapply(split(df, df$label), function(x) split(x, x$responseCode,drop = T))
    
    
    # play with a subset and construct the function to apply
    jsonlite::toJSON(
      lapply(
        purList1[[1]],
        function(x) list(
          R_C_seconds = x$sec,
          R_C_Count   = x$Counting
        )
      ),
      pretty = TRUE
    )
    #> {
    #>   "200": {
    #>     "R_C_seconds": ["15:31:36", "15:31:37"],
    #>     "R_C_Count": [9, 1]
    #>   }
    #> }
    
    
    # apply the function on the whole list
    jsonlite::toJSON(
      lapply(
        purList1,
        lapply,
        function(x) list(
          R_C_seconds = x$sec,
          R_C_Count   = x$Counting
        )
      ),
      pretty = TRUE
    )
    #> {
    #>   "Choose to and fro flights": {
    #>     "200": {
    #>       "R_C_seconds": ["15:31:36", "15:31:37"],
    #>       "R_C_Count": [9, 1]
    #>     }
    #>   },
    #>   "Details": {
    #>     "200": {
    #>       "R_C_seconds": ["15:31:37", "15:31:38", "15:31:39"],
    #>       "R_C_Count": [2, 5, 1]
    #>     },
    #>     "Non HTTP response code: org.apache.http.NoHttpResponseException": {
    #>       "R_C_seconds": ["15:31:37"],
    #>       "R_C_Count": [2]
    #>     }
    #>   }
    #> }
    

    (我不确定,但是 jsonlite::toJSON(purList1, dataframe = "column", pretty = TRUE) 如果您只想转换数据,可能就足够了。柱方向的框架)