如何在dplyr中使用tidyjson

时间:2016-04-14 02:40:21

标签: json r dplyr

我有一个名为data_df的数据框,其中有一列包含json字符串,列名为json_response

我希望从中访问非常具体的键值。 json字符串之一的示例如下。我想知道在字符串中成功的次数是多少次。

x = "[{\"s\":\"D\",\"success\":true,\"start.time\":\"2016-01-27 19:27:27\",\"stop.time\":\"2016-01-27 19:27:30\",\"status_code\":200,\"called\":true,\"milliseconds\":3738.6858,\"_row\":\"DataX\"},{\"s\":\"C\",\"success\":true,\"start.time\":\"2016-01-27 19:27:30\",\"stop.time\":\"2016-01-27 19:27:32\",\"status_code\":200,\"called\":true,\"milliseconds\":1815.1433,\"_row\":\"Clarity\"}]"

如果我只想使用tidyjson,我可以按照以下方式执行,它可以按我的意愿运行。

library(dplyr)
library(tidyjson) 
x %>% gather_array %>% 
    spread_values(called = jstring("called")) %>% 
    summarize(x = sum(called == "TRUE"))

现在,如果我想为整列做这个,我该怎么做?我不想使用循环。

以下是我尝试使用的代码。

data_df %>% 
    transmute(
              test =  json_response %>% gather_array %>% 
                  spread_values(called = jstring("called")) %>% 
                  summarize(x = sum(called=="TRUE")) 
    )

以下是我运行上述代码时出现的错误:

Error: not compatible with STRSXP

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式使用tidyjsonrjson结合使用,而不是dplyr

data_df$test <- data_df %>% rowwise %>% 
      do(test = .$json_response %>% as.character %>% fromJSON %>% sapply(`[[`, "called") %>% sum) %>% 
      as.data.frame

答案 1 :(得分:0)

您可以使用tidyjson进行此操作,只需将data_df转换为tbl_json对象,然后继续操作:

data_df %>% 
  as.tbl_json(json.column = "json_response") %>%
  # track each document if you don't already have an ID
  mutate(rownum = 1:n()) %>% 
  gather_array %>%           
  # use jlogical for correct type
  spread_values(success = jlogical("success")) %>%  
  group_by(rownum) %>% 
  summarize(num.successes = sum(success))