Transformar linhas de um data.frame em um vetor JSON

Olá, comunidade

Estava, aqui, me batendo numa questão provavelmente trivial, que consiste em transformar linhas de um data.frame em vetores individuais no formato JSON. Eu cheguei a uma solução possível, mas ela não segue o pipeline das funções do tidyverse. Estou tentando achar uma solução que siga o pipeline tidyverse.

O resultado desejado é um vetor JSON que cada elemento corresponda a uma chave/coluna valor/linha do data frame.
Ex:
[{“url_base”:“1”,“metodo_http”:“POST”,“ano”:“2010”}]
[{“url_base”:“1”,“metodo_http”:“POST”,“ano”:“2011”}]
[{“url_base”:“1”,“metodo_http”:“POST”,“ano”:“2012”}]

O script que consegui resolver o problema:

library(magrittr)
#> Warning: package 'magrittr' was built under R version 4.0.3

df_dados_consulta <- tibble::tibble(url_base = "1",
                                    metodo_http = "POST",
                                    ano = c("2010", "2011", "2012"))

df <- tibble::tibble(dados = "")

for(i in 1:nrow(df_dados_consulta)){
        
        df <- rbind(df, jsonlite::toJSON(df_dados_consulta[i,]))
        
}

dados_json <- df %>% 
        dplyr::filter(!dados == "")


dados_json$dados
#> [1] "[{\"url_base\":\"1\",\"metodo_http\":\"POST\",\"ano\":\"2010\"}]"
#> [2] "[{\"url_base\":\"1\",\"metodo_http\":\"POST\",\"ano\":\"2011\"}]"
#> [3] "[{\"url_base\":\"1\",\"metodo_http\":\"POST\",\"ano\":\"2012\"}]"

Created on 2020-12-23 by the reprex package (v0.3.0)

O mais próximo que cheguei de consegui uma pipeline na sintaxe tidyverse foi o exemplo abaixo. Contudo, os JSON que obtive não têm chave/coluna.
Ex:
[“1”,“POST”,“2010”]
[“1”,“POST”,“2011”]
[“1”,“POST”,“2012”]

library(magrittr)
#> Warning: package 'magrittr' was built under R version 4.0.3

df_dados_consulta <- tibble::tibble(url_base = "1",
                                    metodo_http = "POST",
                                    ano = c("2010", "2011", "2012"))

json_dados_consulta <- df_dados_consulta %>%
        dplyr::rowwise() %>%
        dplyr::mutate(dados = jsonlite::toJSON(
                dplyr::c_across(
                        dplyr::everything()))) %>%
        dplyr::select(dados)

json_dados_consulta$dados
#> ["1","POST","2010"] ["1","POST","2011"] ["1","POST","2012"]

Created on 2020-12-23 by the reprex package (v0.3.0)

Olá, @George_Santiago!

Falou lista, falou {purrr}! Mas tem mais umas malandragens de {dplyr} também.

Aqui um exemplo que consegui pensar

library(magrittr)

df_dados_consulta <- tibble::tibble(
  url_base = "1",
  metodo_http = "POST",
  ano = c("2010", "2011", "2012")
)

df_dados_consulta %>% 
  dplyr::rowwise() %>% 
  dplyr::group_split() %>% 
  purrr::map_chr(jsonlite::toJSON)
#> [1] "[{\"url_base\":\"1\",\"metodo_http\":\"POST\",\"ano\":\"2010\"}]"
#> [2] "[{\"url_base\":\"1\",\"metodo_http\":\"POST\",\"ano\":\"2011\"}]"
#> [3] "[{\"url_base\":\"1\",\"metodo_http\":\"POST\",\"ano\":\"2012\"}]"

Created on 2020-12-23 by the reprex package (v0.3.0)

EDIT:

Se quiser adicionar o vetor de resultados como uma coluna nova, daria pra fazer isso aqui também:

library(magrittr)

df_dados_consulta <- tibble::tibble(
  url_base = "1",
  metodo_http = "POST",
  ano = c("2010", "2011", "2012")
)

json_dados_consulta <- df_dados_consulta %>% 
  dplyr::rowwise() %>% 
  dplyr::mutate(
    dados = jsonlite::toJSON(dplyr::cur_data())
  ) %>% 
  dplyr::ungroup()
  
json_dados_consulta$dados
#> [{"url_base":"1","metodo_http":"POST","ano":"2010"}] [{"url_base":"1","metodo_http":"POST","ano":"2011"}] [{"url_base":"1","metodo_http":"POST","ano":"2012"}]

Created on 2020-12-23 by the reprex package (v0.3.0)

Obs: cur_data() pega os dados de dentro do grupo

1 curtida

Muito Obrigado, @jtrecenti !!!

Eu achei que depois de dplyr::rowwise() , nunca mais precisaria fazer um purrr::map_* numa pipeline. Pelo jeito, estou enganado. kkkkkkk

Foi por isso que quando fiz combinações de dplyr::rowwise() e jsonlite::toJSON , não estava funcionando. Ainda preciso estudar mais os casos de aplicação do purrr no tratamento de dados para não precisar fazer armengue no código.
Mais uma vez, Muito obrigado. Você, como sempre, sando a galera da comunidade R.

1 curtida