r - 有没有一种简洁的方法来读取 JSON 字符串并将其转换为新变量?

标签 r json

我有一个 JSON 字符串,我想将其插入新变量中。我觉得一定有一个聪明的方法,但我找不到解决方案。

df <- structure(list(subject = c("dtv85251vucquc45", "mcj8vdqz7sxmjcr0"
), response = c("{\"P0_Q0\":{\"aktiv\":2,\"bekümmert\":3,\"interessiert\":4,\"freudig erregt\":2,\"verärgert\":2,\"stark\":0,\"schuldig\":1,\"erschrocken\":1,\"feindselig\":1,\"angeregt\":2},\"P1_Q0\":{\"stolz\":1,\"gereizt\":1,\"begeistert\":2,\"beschämt\":2,\"wach\":1,\"nervös\":1,\"entschlossen\":1,\"ängstlich\":1,\"aufmerksam\":2,\"durcheinander\":2}}", 
                "{\"P0_Q0\":{\"aktiv\":1,\"bekümmert\":3,\"interessiert\":1,\"freudig erregt\":1,\"verärgert\":0,\"stark\":0,\"schuldig\":2,\"erschrocken\":0,\"feindselig\":0,\"angeregt\":1},\"P1_Q0\":{\"stolz\":2,\"gereizt\":0,\"begeistert\":1,\"beschämt\":0,\"wach\":2,\"nervös\":0,\"entschlossen\":0,\"aufmerksam\":2,\"durcheinander\":0,\"ängstlich\":0}}"
)), class = c("tbl_df", 
              "tbl", "data.frame"), row.names = 1:2, class = "data.frame")

期望的输出:

output <- structure(list(subject = c("dtv85251vucquc45", "mcj8vdqz7sxmjcr0"
), aktiv = 2:1, bekümmert = c(3L, 3L), interessiert = c(4L, 
1L), freudig.erregt = 2:1, verärgert = c(2L, 0L), 
    stark = c(0L, 0L), schuldig = 1:2, erschrocken = 1:0, 
    feindselig = 1:0, angeregt = 2:1, stolz = 1:2, 
    gereizt = 1:0, begeistert = 2:1, beschämt = c(2L, 
    0L), wach = 1:2, nervös = 1:0, entschlossen = 1:0, 
    ängstlich = 1:0, aufmerksam = c(2L, 2L), durcheinander = c(2L, 
    0L)), class = "data.frame", row.names = c(NA, -2L))

什么样的作品(但不整洁):

j <- list()
for(i in 1:nrow(df)){
  j[[i]] <- as.data.frame(jsonlite::fromJSON(df$response[i]))
}

output <- data.frame(subject=df$subject, bind_rows(j))

有更好的方法吗?

最佳答案

jsonlite::stream_in 对此效果很好。

library(dplyr)
jsonlite::stream_in(textConnection(df$response), simplifyDataFrame = FALSE) %>%
  lapply(bind_cols) %>%
  bind_rows() %>%
  bind_cols(df[,1,drop=FALSE], .)
#  Imported 2 records. Simplifying...
#            subject aktiv bekümmert interessiert freudig erregt verärgert stark
# 1 dtv85251vucquc45     2         3            4              2         2     0
# 2 mcj8vdqz7sxmjcr0     1         3            1              1         0     0
#   schuldig erschrocken feindselig angeregt stolz gereizt begeistert beschämt
# 1        1           1          1        2     1       1          2        2
# 2        2           0          0        1     2       0          1        0
#   wach nervös entschlossen ängstlich aufmerksam durcheinander
# 1    1      1            1         1          2             2
# 2    2      0            0         0          2             0

或稍微重构:

library(dplyr)
library(tidyr) # unnest
df %>%
  mutate(
    response = jsonlite::stream_in(textConnection(response), simplifyDataFrame = FALSE),
    response = lapply(response, bind_cols)
  ) %>%
  unnest(response)
#  Imported 2 records. Simplifying...
# # A tibble: 2 × 21
#   subject      aktiv bekümmert interessiert `freudig erregt` verärgert stark schuldig erschrocken feindselig angeregt
#   <chr>        <int>     <int>        <int>            <int>     <int> <int>    <int>       <int>      <int>    <int>
# 1 dtv85251vuc…     2         3            4                2         2     0        1           1          1        2
# 2 mcj8vdqz7sx…     1         3            1                1         0     0        2           0          0        1
# # ℹ 10 more variables: stolz <int>, gereizt <int>, begeistert <int>, beschämt <int>, wach <int>, nervös <int>,
# #   entschlossen <int>, ängstlich <int>, aufmerksam <int>, durcheinander <int>

关于r - 有没有一种简洁的方法来读取 JSON 字符串并将其转换为新变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76447100/

相关文章:

r - 删除数据框中某个变量下值为 0 的行

r - Choroplethr 中的定制垃圾箱

r - 列内的 Str_sort,同时保留 data.frame 中的顺序

javascript - Express 和 ejs <%= 渲染 JSON

json - Postgres 选择作为 json 散列

php - 从 PHP 制作 JSON 并将其显示在我的 jQuery 成功案例中的最佳方式?

R:data.table .动态聚合列日期列

r - R函数解析命令行参数

javascript - 如果 "this"为空字符串,则 Handlebars 中的 {{#each this}} 不起作用

javascript - 为什么我会收到意外的 token \