R 使用嵌套JSON转换列
我有一个名为df的数据帧:R 使用嵌套JSON转换列,r,function,dataframe,R,Function,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并将它们转换为列。我使用第一行的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”是列。现在我想对每一行中的每个json都这样做,并与原始数据帧绑定。因此,预期结果必须如下所示:
user message.sender message.card
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
如何编写该函数?如果解决方案必须使用您当前的方法,您可以使用它准备函数:
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
}
对于所有的消息
值,您可以使用purrr::map\u 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
purrr::map\u dfr(df$消息,获取数据)
#允许用户message.sender message.card message.allowed
#1用户10 K3532876
#2用户14 hg769 64343654
#3用户22 gjhyj5 87676876正确
@RonakShah它的不同原因是它关于绑定数据帧,而不是解析。在这里,我已经提供了用于解析的代码(不是以提供的方式),问题是如何将解析得到的数据帧与原始数据绑定在一起frame@RonakShah解决方案必须包含以下代码df_col%fromJSON()df_col
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