tidyjson代码中的变量名称

约翰·大卫·史密斯

我想在一个函数中为tidyjson包编写代码,如下所示:

> enter_object(object) %>%    spread_values(
>     varnames[1] = jstring(strings[1]),
>     varnames[2] = jstring(strings[2]),
>     varnames[3] = jstring(strings[3])   )

如果我有foo而不是的文字字符串,则此代码可以正常运行varnames[1]但是我希望函数更加灵活,这样我就可以生成很多varname,而不必手工编写。变量名称最终作为数据框列的名称。由于当前的失败,我得到:

+         enter_object(object) %>% 
+         spread_values(
+           varnames[[1]] = jstring(strings[1]),
Error: unexpected '=' in:
"        spread_values(
          varnames[[1]] ="
>           varnames[2] = jstring(strings[2]),
Error: unexpected ',' in "          varnames[2] = jstring(strings[2]),"
>           varnames[3] = jstring(strings[3])
Error in prep_path(...) : object 'strings' not found
>         ) 
Error: unexpected ')' in "        )"

我无法弄清楚要放在哪种对象之前=以便=识别。


这是一个使用MrFlick解决方案的玩具示例:

> sample_json <- '[
+     {
+         "id": 10097652,
+         "members": 2386,
+         "category": {
+             "id": 23,
+             "name": "Outdoors & Adventure",
+             "shortname": "Outdoors"
+         }   
+   }
+ ]'
> 
> group_category1 <- sample_json %>%  as.tbl_json %>% 
+     gather_array %>%  #gather_keys %>% 
+     spread_values(
+       group_id = jstring("id")
+   ) %>%
+       enter_object("category") %>% 
+       spread_values(
+         category_id = jstring("id"),
+         category_name = jstring("name"),
+         category_short_name = jstring("shortname")
+       ) 
> head(group_category1)
  document.id array.index group_id category_id        category_name category_short_name
1           1           1 10097652          23 Outdoors & Adventure            Outdoors
> 
> my_spread_values <- function(x, names, values) { 
+     stopifnot(length(names) == length(values))
+     do.call("spread_values", c(list(x), setNames(as.list(values), names )))
+  } 
> varnames <-  c("category_id", "category_name", "category_shortname")
> strings <-  c("id", "name", "shortname")
> 
> group_category2 <- sample_json %>%  as.tbl_json %>% 
+   gather_array %>% 
+   spread_values(group_id = jstring("id")) %>% 
+ enter_object("category") %>% my_spread_values( 
+     varnames, list(jstring(strings[1]), jstring(strings[2]), jstring(strings[3]) ) )
> head(group_category2)
  document.id array.index group_id category_id        category_name category_shortname
1           1           1 10097652          23 Outdoors & Adventure           Outdoors
> 

那完全有效!(一旦我犯了一些粗心的错误,就解决了!)

约翰·大卫·史密斯

这是我现在使用的@MrFlick的示例之后的变体:

my_spread_values <- function(x, names_list, string_type) {
  # A wrapper for "spread_values" that taks a list of names and a string type. Easier to read and much less code.
  do.call("spread_values",
    c(list(x), setNames(lapply(names_list, string_type), as.list(names_list) ) ) )
}

根据此处的文档定义的URL:http//www.meetup.com/meetup_api/docs/

raw_contents <- GET(url = url)
json_raw <- httr::content(raw_contents, type = "text")
json_contents <- sub('^\\{"results":\\[', "[", json_raw)
json_contents <- sub('\\],"meta"\\:\\{.*\\}.$', "]",json_contents)
my_tbl_json <- gsub('\\\\/', "/",json_contents)  %>% as.tbl_json

num_array <- c("created", "id", "lat", "lon", "members", "score")

group_numerics <- my_tbl_json %>% 
  gather_array %>% 
  my_spread_values(num_array, jnumber )  %>% 
  select(-document.id)
group_numerics$created <- as.POSIXct(group_numerics$created/1000, origin = "1970-01-01")

一个更扩展的示例是这套工作代码,它使用tidyjson包来处理来自真实API数据源的数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章