在dataframe中解析json列

在dataframe中解析json列,r,json,dataframe,R,Json,Dataframe,我有一个名为df的数据帧: ID Message 1 {"user":user10, "message":{"sender":"k3532", "card":87876}} 2 {"user":user14, "message":{"sender":"hg769", "card"

我有一个名为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"
))
我这样做是为了将json转换为数据帧:

message1 <- df[1,]$Message %>% 
  fromJSON() 
data_raw1 <- enframe(unlist(message1))
现在,我想用这种方式将其与原始数据帧绑定。因此,在转换后,它必须如下所示:

name              value
user              user10
message.sender    k3532
message.card      87876
name    user       message.sender   message.card
value   user10       k3532            87876
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   
我想对每行中的每个json都这样做,然后将它们与原始datafarme绑定。因此,最终结果必须如下所示:

name              value
user              user10
message.sender    k3532
message.card      87876
name    user       message.sender   message.card
value   user10       k3532            87876
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   
我怎么能这么做?这种转变对我来说太复杂了。它的必要性是,它发生在转置操作中

具有与您类似的需求


df = data.frame(df)


out = purrr::map_dfr(df$Message, function(msg) {
  msg %>% 
    jsonlite::fromJSON() %>% 
    data.frame
})


out = cbind(df, out)
out$Message = NULL
out

产生

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

jsonlite::stream_in
适用于具有多个单独json块的情况:

cbind(df["ID"], stream_in(textConnection(df$Message)))

# Found 3 records...
# Imported 3 records. Simplifying...
#  ID   user message.sender message.card message.allowed
#1  1 user10          k3532        87876              NA
#2  2 user14          hg769   6434363654              NA
#3  3 user22         gjhyj5     87676876            TRUE
”%!in%'=函数(x,y)!(“%in%”(x,y))
df=cbind(df$ID,df=data.frame(
应用(df,1,功能(x){
请在将来使用
dput(df)
制作一个可复制和可复制的MWE