用一列熔化列表

时间:2018-02-07 01:06:18

标签: json r

我有json文件,看起来像这样

[
    {
        "frameId": 0E+1,
        "par": "02",
        "data": [
            {
                "dur": 158.0,
                "reg": "one",
                "sreg": null
            },
            {
                "dur": 217.0,
                "reg": "one",
                "sreg": null
            }
        ]
    },
    {
        "frameId": 0E+1,
        "par": "03",
        "data": [
            {
                "dur": 193.0,
                "reg": "one",
                "sreg": null
            },
            {
                "dur": 160.0,
                "reg": "two",
                "sreg": null
            }
        ]
    }
]

当我在R中读到它时,我有以下数据框

str(d)
'data.frame':   8 obs. of  3 variables:
 $ frameId: num  0 0 0.1 0.1 0.2 0.2 0.3 0.3
 $ par     : chr  "02" "03" "02" "03" ...
 $ data   :List of 8
  ..$ :'data.frame':    103 obs. of  3 variables:
  .. ..$ dur : num  158 217 492 75 142 117 100 200 383 192 ...
  .. ..$ reg : chr  "one" "one" "one" "one" ...
  .. ..$ sreg: chr  NA NA NA NA ...
  ..$ :'data.frame':    114 obs. of  3 variables:
  .. ..$ dur : num  193 160 183 223 160 100 97 153 143 420 ...
  .. ..$ reg : chr  "one" "one" "one" "one" ...
  .. ..$ sreg: chr  NA NA NA NA ...
  ..$ :'data.frame':    107 obs. of  3 variables:
  .. ..$ dur : num  158 217 492 75 142 117 100 200 383 192 ...
  .. ..$ reg : chr  "one" "one" "one" "one" ...
  .. ..$ sreg: chr  NA NA NA NA ...

我希望使用dataframeId来融合列表par。这样我的最终数据就会如此。即对列表data中的每个元素重复frameId和par列。

frameId | par | dur | reg | sreg

1 个答案:

答案 0 :(得分:2)

我们可以使用unnest转换为'长'格式

library(tidyr)
unnest(d)
# A tibble: 4 x 5
#  frameId   par   dur reg    sreg 
#   <dbl> <dbl> <dbl> <fctr> <lgl>
#1       0  2.00   158 one    NA   
#2       0  2.00   177 one    NA   
#3       0  3.00   193 one    NA   
#4       0  3.00   160 one    NA   

数据

library(dplyr)
d <- data_frame(frameId = c(0, 0), par = c(2, 3),
    data = list(data.frame(dur = c(158, 177), reg = c("one", "one"),  sreg = c(NA, NA)), 
     data.frame(dur = c(193, 160), reg = c("one", "one"), sreg = c(NA, NA))))