【问题标题】:Split a string to dataframe (Col name and value) in R在R中将字符串拆分为数据框(列名和值)
【发布时间】:2020-08-07 14:45:27
【问题描述】:

我正在尝试拆分一些数据(字符串)并将它们放入数据框中。在我的字符串中,第一个是 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]等值中用到的“,”比较多,所以不能用这个方法!

我以某种方式区分了文本中使用的“,”并将它们替换为不同的字符。

更新 完整的字符串:

"{\"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}"

【问题讨论】:

  • 您的数据看起来非常像 json,但如果是这样,则说明它已损坏,请注意 \"hDWIID\" 之后您的 R 字符串以 d 引号结尾,但字符串不会停止。此外,您的示例数据在没有完成的情况下突然结束。如果这是您的所有数据,那么您就有麻烦了,因为它与自己的格式不一致。如果还有更多,请提供所有内容。无论如何,如果它是正确的,那么您可以获得带有jsonlite::fromJSON(paste0("{", thisstring, "}")) 的命名列表。但是,从那里开始,您可能会遇到问题,因为这不是“正常”的 json 编码帧。
  • @r2evans 是的,你是对的。我只是复制了一小部分。我提供了完整的数据。好吧,我不知道那是来自 Json。

标签: r string dataframe replace split


【解决方案1】:

我们可以从为处理 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。这也为每个元素提供了单独的行。

如果您想将每个键保留为单行并将值保留为列表,我们可以使用tibble 中的enframe

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

【讨论】:

    【解决方案2】:

    您可以使用separate_rows()separate() 将字符串与tidyverse 分开。

    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}
    

    reprex package (v0.3.0) 于 2020 年 4 月 24 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多