从字典列中提取数据到 R 数据框

时间:2021-06-25 12:04:38

标签: r json regex

我有一个如下所示的数据框:

<头>
其余数据框 columnToSeparate
blablarow1 {"info1":"row1string1","info2":"row1string2"}
blablarow2 {"info1":"row2string1","info2":"row2string2"}

在我的数据框中将这些信息作为单独的列提取以获得类似信息的最佳方法是什么:

<头>
其余数据框 信息1 信息2
blablarow1 row1string1 row1string2
blablarow2 row2string1 row2string2

这是创建数据框的代码

df <- data.frame(RestOfDF  = c("blablarow1", "blablarow2"),
                 columnToSeparate = c('{"info1":"row1string1","info2":"row1string2"}',
                                      '{"info1":"row2string1","info2":"row2string2"}'))

更新:我真正的专栏有很多信息字段,所以我希望尽可能自动地做一些事情,因为名称实际上是不同的。就像是 {"mydogsname":"pinky","mycatsfood":"icecream"...}

4 个答案:

答案 0 :(得分:3)

清理 columnToSeparate 列,删除不需要的文本(即删除 ["{}]),通过逗号分隔 (,) 将文本拆分为不同的行,并通过冒号 ({ {1}})。使用 : 获取宽格式数据。

pivot_wider

答案 1 :(得分:3)

我认为这也有帮助:

library(dplyr)
library(stringr)

df %>%
  magrittr::extract(1) %>%
  bind_cols(str_extract_all(df$columnToSeparate, "(\\w+\\d+)(\\w+\\d+)", simplify = TRUE) %>%
              as_tibble() %>%
              setNames(c("info1", "info2")))

    RestOfDF       info1       info2
1 blablarow1 row1string1 row1string2
2 blablarow2 row2string1 row2string2

答案 2 :(得分:1)

这是一个 dplyrstringr 解决方案:

library(stringr)
library(dplyr)
df %>% 
  # get rid of metachars:
  mutate(columnToSeparate = gsub('[\\"{}]', '', columnToSeparate)) %>%
  # extract `info1` using lookbehind and lookahead:
  mutate(info1 = str_extract(columnToSeparate, "(?<=:)[^,:]+(?=,)")) %>%
  # extract `info2` using lookbehind and lookahead:
  mutate(info2 = str_extract(columnToSeparate, "(?<=:)[^,:]+(?=$)")) %>%
  # remove obsolete column:
  select(-2)
    RestOfDF       info1       info2
1 blablarow1 row1string1 row1string2
2 blablarow2 row2string1 row2string2 

答案 3 :(得分:0)

显然,columnToSeparate 是 JSON 格式。所以,我们可以

  1. 使用 fromJSON() 包中的 jsonlite 函数解析数据,
  2. 使用 rbindlist() 包中的 data.table 创建具有单独列的 data.frame,
  3. 并根据要求将此中间结果与原始 df 结合起来。
setDT(df)[, rbindlist(Map(jsonlite::fromJSON, columnToSeparate), 
                      fill = TRUE, idcol = "columnToSeparate")][
                        df, on = "columnToSeparate"][
                          , columnToSeparate := NULL][]
<块引用>
         info1       info2       info4   RestOfDF
1: row1string1 row1string2        <NA> blablarow1
2: row2string1 row2string2        <NA> blablarow2
3:        <NA>        <NA>        <NA> blablarow3
4:        <NA>        <NA> row4string4 blablarow4

请注意,已使用修改后的数据集来涵盖其他边缘情况,因为 OP 已提到“名称实际上不同”。

数据

df <- data.frame(RestOfDF  = paste0("blablarow", 1:4),
                 columnToSeparate = c('{"info1":"row1string1","info2":"row1string2"}',
                                      '{"info1":"row2string1","info2":"row2string2"}',
                                      '{}',
                                      '{"info4":"row4string4"}'))

第 1 到第 2 行取自 OP 的原始数据集。
第 3 行没有数据。
第 4 行只有一个数据项并使用不同的名称。