在dataframe中解析json列
我有一个名为df的数据帧:在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"
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