我有一个名为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
答案 0 :(得分:2)
您可以通过以下方式使用tidyjson
与rjson
结合使用,而不是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))