解析类似于字典的结构,其中键和值是使用R的数值

问题描述 投票:0回答:1

我正在尝试解析我在旅途中遇到的一些奇怪的数据结构。从本质上讲,它们类似于python或javascript字典,但键和值均为数字:

weird <- "{47=4578.0005, 181=23456.7831, 216=7548.2367}"

[希望将其转换为表,我尝试将其转换为更典型的字典格式并使用jsonlite进行解析:

library(tidyverse)
library(jsonlite)
weird <- parse_json(str_replace(weird, "=", ":"))
#> Error: parse error: invalid object key (must be a string)

parse_json函数正确地抱怨该键不是字符串。我当然可以使用str_split来剖析所有这些内容,但是我希望一个善良的人能够对一个更优雅/更紧凑的解决方案(希望完全避免使用正则表达式)有所了解,从而可以将其解析为一个表:

tibble::tribble(
  ~ key,    ~ value,
  47,  4578.0005,
  181, 23456.7831,
  216,  7548.2367 
)
#> # A tibble: 3 x 2
#>     key  value
#>   <dbl>  <dbl>
#> 1    47  4578.
#> 2   181 23457.
#> 3   216  7548.

谢谢!

r dictionary jsonlite
1个回答
1
投票
JSON要求引用其字典键。尽管此解决方案也引用了值,但将as.numeric应用于值应该不难(如果您确定数据的主体)。

library(dplyr) library(tidyr) gsub("=", ":", gsub("\\b(-?[0-9.]+)\\b", '"\\1"', weird)) %>% jsonlite::fromJSON(.) %>% enframe() %>% unnest(value) # # A tibble: 3 x 2 # name value # <chr> <chr> # 1 47 4578.0005 # 2 181 23456.7831 # 3 216 7548.2367

这假设所有键和值都是完全数字的(可能是负数,可能是十进制),但是在此模式中没有科学的记号。包括在内并非不可能,因此,如果需要进一步说明,可以使用https://www.regular-expressions.info/floatingpoint.htmlParsing scientific notation sensibly?Regex for numbers on scientific notation?

下一步可能很简单

gsub("=", ":", gsub("\\b(-?[0-9.]+)\\b", '"\\1"', weird)) %>% jsonlite::fromJSON(.) %>% enframe() %>% unnest(value) %>% mutate_all(as.numeric) # # A tibble: 3 x 2 # name value # <dbl> <dbl> # 1 47 4578. # 2 181 23457. # 3 216 7548.

(明显的小数位损失只是一个表示,原始数据仍然具有非整数值。)
© www.soinside.com 2019 - 2024. All rights reserved.