【问题标题】:Converting column with nested jsons使用嵌套 json 转换列
【发布时间】:2020-08-20 08:52:10
【问题描述】:

我有一个名为 df 的数据框:

ID    Message
1     {"user":user10, "message":{"sender":"k3532", "card":87876}}
2     {"user":user14, "message":{"sender":"hg769", "card":6434363654}}
3     {"user":user22, "message":{"sender":"gjhyj5", "card":87676876, "allowed":true}}

你可以通过它创建

df = structure(list(ID = 1:3, Message = c("{\"user\":\"user10\", \"message\":{\"sender\":\"k3532\", \"card\":87876}}", 
                                     "{\"user\":\"user14\", \"message\":{\"sender\":\"hg769\", \"card\":6434363654}}", 
                                     "{\"user\":\"user22\", \"message\":{\"sender\":\"gjhyj5\", \"card\":87676876, \"allowed\":true}}"
)), row.names = c(NA, -3L), class = c("data.frame"
))

我想解析 Message 列中的那些 json 并将它们转换为列。我使用第一行的 json 执行此操作:

df_col <- df[1,]$Message %>% 
  fromJSON() 
df_col <- enframe(unlist(df_col))
df_col <- setNames(data.frame(as.list(df_col$value)), df_col$name)

我得到了数据框,它看起来像这样:

user      message.sender  message.card
user10      k3532            87876

其中“user”“message.sender”“message.card”是列。现在我想对每一行中的每个 json 执行此操作并与原始数据框绑定。所以,想要的结果必须是这样的:

ID    name    user       message.sender   message.card    message.allowed
1     value   user10       k3532            87876            NA
2     value   user14       hg769            6434363654       NA
3     value   user22       gjhyj5           87676876         TRUE   

我该如何编写那个函数?

【问题讨论】:

  • @RonakShah 其不同的原因在于绑定数据帧,而不是解析。在这里,我已经提供了解析代码(不是以提供的方式),一个问题是关于将我从解析中获得的数据帧与原始数据帧绑定
  • @RonakShah,解决方案必须包含此代码 df_col &lt;- df[1,]$Message %&gt;% fromJSON() df_col &lt;- enframe(unlist(df_col)) df_col &lt;- setNames(data.frame(as.list(df_col$value)), df_col$name)。这很重要。我不问怎么解析,我问怎么绑定

标签: r function dataframe


【解决方案1】:

如果解决方案必须使用您当前的方法,您可以使用它准备一个函数:

get_data <- function(message) {
  df_col <- message %>% jsonlite::fromJSON
  df_col <- tibble::enframe(unlist(df_col))
  df_col <- setNames(data.frame(as.list(df_col$value)), df_col$name)
  df_col
}

这适用于这样的一个值:

get_data(df$Message[1])
    user message.sender message.card
1 user10          k3532        87876

对于所有Message 值,您可以使用purrr::map_dfr

purrr::map_dfr(df$Message, get_data)

#    user message.sender message.card message.allowed
#1 user10          k3532        87876            <NA>
#2 user14          hg769   6434363654            <NA>
#3 user22         gjhyj5     87676876            TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2021-09-26
    • 2016-08-09
    • 2020-03-21
    • 1970-01-01
    • 2022-01-03
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多