如何在R中提取出某些条目为NULL且存在的变量有时不同的JSON列?

wkyowqbh  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(85)

我在R中有一个数据集,它是这样的格式:
| 公司名称|提交数据| submitted_data |
| --|--| ------------ |
| 鲍勃公司|{“dob”:2002-03-04,“tel”:|1234} 1234} |
| 法德拉公司|空值| NULL |
| 安德鲁公司|{“dob”:1999-10-10,“industry”:|零售} retail} |
我希望将“submitted_data”列中的数据提取到单独的列中,使用相应的值并保留NULL,例如上面应该看起来像这样:
| 公司名称|多卜|泰尔|工业| industry |
| --|--|--|--| ------------ |
| 鲍勃公司|2002-03-04|一二三四|零| null |
| 法德拉公司|空值|空值|空值| NULL |
| 安德鲁公司|1999年10月10日|零|零售| retail |
我知道我需要使用jsonlite包,但到目前为止,它抛出了错误,不能得到任何地方。- 谢谢-谢谢

eiee3dmh

eiee3dmh1#

本质上你的问题是你的列是not valid json
除了数字、对象和数组之外,唯一允许的不带引号的实体是null、true、false。
我们可以使用模式gsub(":(.*?)([,}])", ':"\\1"\\2', txt)来替换:的所有示例,然后用引号中的值替换该值(例如将"dob" : 2002-03-04替换为"dob" : "2002-03-04")。
我在这里使用了dplyr::bind_rows(),因为它是一种简单的方法来绑定一个json对象列表,这些对象的每行没有相同的键。

library(dplyr)
dat_list <- lapply(split(dat, seq(nrow(dat))), \(row) {
    txt <- row$submitted_data
    name_df <- data.frame(Name = row$Name)
    if (txt == "NULL") {
        df_out <- name_df
    } else {
        json_txt  <- jsonlite::fromJSON(gsub(":(.*?)([,}])", ':"\\1"\\2', txt))
        df_out <- cbind(name_df, data.frame(json_txt))
    }
    df_out
})

dat |>
    select(-submitted_data) |>
    left_join(bind_rows(dat_list), by = "Name")

#     Name     Company         dob   tel industry
# 1    Bob    Bob Inc.  2002-03-04  1234     <NA>
# 2 Fadela  Fadela Co.        <NA>  <NA>     <NA>
# 3   Andy Andrew Inc.  1999-10-10  <NA>   retail

字符串

输入数据:

dat  <- structure(list(Name = c("Bob", "Fadela", "Andy"), Company = c("Bob Inc.", 
"Fadela Co.", "Andrew Inc."), submitted_data = c("{\"dob\":2002-03-04, \"tel\": 1234}", 
"NULL", "{\"dob\": 1999-10-10, \"industry\": retail}")), class = "data.frame", row.names = c(NA, 
-3L))

相关问题