Разбить строку на фрейм данных (имя и значение Col) в R - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь разделить некоторые данные (строки) и поместить их в кадр данных. в моей строке первая - это имя col, а вторая - его значение. Мои данные выглядят так:

 "\"id\":247,\"hseStr\":[1,1,1,1],\"pertun\":96,\"sqrMtr\":[2500,2500,2500,2500,2500,2500],\"hDWInt\":[],\"hDWIIncptn\":[],\"hDWIID\"":[],\"cntRateRgn\":\"2102B02\",\"prclID\":\"4748403C\", \"hAction\":null ,\"mAction\":null,\"addrGrps\":null,\"hseEQDdctbl\":[51.8594958810969,42.

В идеале я хочу стать чем-то вроде этого:

id      hseStr    pertun  sqrMtr ...

247   [1,1,1,1]     96     [2500,2500,2500,2500,2500,2500]...

Ранее я разделял данные на ",", а затем помещал их в таблица, но здесь, поскольку в значениях, таких как [1,1,1,1], используется больше ",", я не могу использовать этот метод!

Я как-то различаю guish между ",", которые используются в моем тексте, и замените их другим символом.

Обновление Полная строка:

"{\"id\":21247,\"hs111\":[1,1,1,1],\"p2n\":96,\"sq211\":[20,500,20,20,20,20],\"hoi\":[],\"hsa\":[],\"h961\":[],\"h885\":[],\"t252\":[],\"cn01\":[],\"cD56\":[],\"cI65\":[],\"mD24\":[],\"mD23\":[],\"m63\":[],\"m985\":[],\"h23\":[],\"c112\":[],\"m41\":[],\"r54\":1,\"m63\":\"S6\",\"hs74\":\"2\",\"c55\":\"21\",\"p12\":\"4C\",\"h11\":null,\"m14\":null,\"a12\":null,\"h88\":[1.8,2.3,6.4,28.2,17.9,11.0,7.0,4.1,2.5,0],\"h87\":[3.9,6.1,6.9,4.2,3.7,2.487,1.6],\"cn98\":[1.25,3.1,1.4,12.1,5.3,2.2,1.1,0.5,0.2,0],\"h76\":null,\"c12\":null,\"m54\":null}"

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Мы можем получить помощь от пакетов, созданных для работы с JSON:

stack(jsonlite::fromJSON(string))


#   values   ind
#1   21247    id
#2       1 hs111
#3       1 hs111
#4       1 hs111
#5       1 hs111
#6      96   p2n
#7      20 sq211
#8     500 sq211
#9      20 sq211
#10     20 sq211
#11     20 sq211
#12     20 sq211
#13      1   r54
#14     S6   m63
#15      2  hs74
#16     21   c55
#17     4C   p12
#18    1.8   h88
#19    2.3   h88
#20    6.4   h88
#...
#...

Это удалит NULL значения из вывода, вы можете заменить его на NA, если хотите сохранить Это. Также это дает отдельные строки для каждого элемента.

Если вы хотите сохранить каждую клавишу как одну строку, а значения как список, мы можем использовать enframe из tibble.

tibble::enframe(jsonlite::fromJSON(string))


# A tibble: 33 x 2
#   name  value     
#   <chr> <list>    
# 1 id    <int [1]> 
# 2 hs111 <int [4]> 
# 3 p2n   <int [1]> 
# 4 sq211 <int [6]> 
# 5 hoi   <list [0]>
# 6 hsa   <list [0]>
# 7 h961  <list [0]>
# 8 h885  <list [0]>
# 9 t252  <list [0]>
#10 cn01  <list [0]>
# … with 23 more rows
1 голос
/ 24 апреля 2020

Вы можете разделить строку с помощью tidyverse, используя separate_rows() и separate().

library(tidyverse)
string <- "{\"id\":21247,\"hs111\":[1,1,1,1],\"p2n\":96,\"sq211\":[20,500,20,20,20,20],\"hoi\":[],\"hsa\":[],\"h961\":[],\"h885\":[],\"t252\":[],\"cn01\":[],\"cD56\":[],\"cI65\":[],\"mD24\":[],\"mD23\":[],\"m63\":[],\"m985\":[],\"h23\":[],\"c112\":[],\"m41\":[],\"r54\":1,\"m63\":\"S6\",\"hs74\":\"2\",\"c55\":\"21\",\"p12\":\"4C\",\"h11\":null,\"m14\":null,\"a12\":null,\"h88\":[1.8,2.3,6.4,28.2,17.9,11.0,7.0,4.1,2.5,0],\"h87\":[3.9,6.1,6.9,4.2,3.7,2.487,1.6],\"cn98\":[1.25,3.1,1.4,12.1,5.3,2.2,1.1,0.5,0.2,0],\"h76\":null,\"c12\":null,\"m54\":null}"

as.data.frame(string) %>% separate_rows(string, string, sep = ",\"") %>% 
  separate(string, into = c("category","value"), sep = "\":")
#>    category                                      value
#> 1      {"id                                      21247
#> 2     hs111                                  [1,1,1,1]
#> 3       p2n                                         96
#> 4     sq211                       [20,500,20,20,20,20]
#> 5       hoi                                         []
#> 6       hsa                                         []
#> 7      h961                                         []
#> 8      h885                                         []
#> 9      t252                                         []
#> 10     cn01                                         []
#> 11     cD56                                         []
#> 12     cI65                                         []
#> 13     mD24                                         []
#> 14     mD23                                         []
#> 15      m63                                         []
#> 16     m985                                         []
#> 17      h23                                         []
#> 18     c112                                         []
#> 19      m41                                         []
#> 20      r54                                          1
#> 21      m63                                       "S6"
#> 22     hs74                                        "2"
#> 23      c55                                       "21"
#> 24      p12                                       "4C"
#> 25      h11                                       null
#> 26      m14                                       null
#> 27      a12                                       null
#> 28      h88 [1.8,2.3,6.4,28.2,17.9,11.0,7.0,4.1,2.5,0]
#> 29      h87            [3.9,6.1,6.9,4.2,3.7,2.487,1.6]
#> 30     cn98  [1.25,3.1,1.4,12.1,5.3,2.2,1.1,0.5,0.2,0]
#> 31      h76                                       null
#> 32      c12                                       null
#> 33      m54                                      null}

Создано в 2020-04-24 с помощью пакета Представить (v0.3.0)

...