我正在尝试解析我在旅途中遇到的一些奇怪的数据结构。从本质上讲,它们类似于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.
谢谢!
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.html,Parsing 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.
(明显的小数位损失只是一个表示,原始数据仍然具有非整数值。)