измените формат сериализации json для фрейма данных R в api водопроводчика

#r #json #dataframe #plumber

Вопрос:

У меня есть фрейм данных в R, который я хочу сериализовать в json в определенном формате. Пример кода:

 df_t<-data.frame(c(453:458),c(1:6), row.names = NULL)
colnames(df_t) <- c("area", "price")
jsonlite::toJSON(df_t)
 

Формат вывода приведенного выше кода выглядит следующим образом:

[{«area»:453,»price»:1},{«area»:454,»price»:2},{«area»:455,»price»:3},{«area»:456,»price»:4},{«area»:457,»price»:5},{«area»:458,»price»:6}]

Но формат, который я хочу, это:

{«площадь»:[453,454,455,456,457,458],»цена»:[1,2,3,4,5,6]}

Чтобы получить требуемый формат, я написал этот фрагмент кода, который дает мне результат, аналогичный тому, что я ожидаю, но заключенный в кавычки:

 paste0( '{', colnames(df_t)[1], ':', jsonlite::toJSON(df_t[,1]),  ',', colnames(df_t)[2], ':', jsonlite::toJSON(df_t[,2]), '}')
 

«{площадь:[453,454,455,456,457,458],цена:[1,2,3,4,5,6]}»

Мой вопрос в том, есть ли лучший способ получить нужный мне формат? Кадр данных возвращается из api R plumber и поэтому по умолчанию использует сериализатор jsonlite.

Комментарии:

1. Вы явно называете свое df имя с "453" помощью etc, я не понимаю, чего вы ожидаете "area" от этого. Похоже, что вы colnames(.) ошибаетесь, и тогда вам нужно отключить plumber внутреннюю сериализацию и вместо этого позвонить jsonlite::toJSON(., dataframe="columns") себе.

2. @r2evans извини. Теперь я перефразировал этот вопрос

3. Чтобы добавить в @r2evans пункты, касающиеся фрейма данных, кажется, что вы работаете в противоположность структуре фрейма данных. Фрейм данных-это список векторов одинаковой длины, и списки гораздо легче поддаются структуре json. возможно, изменение сериализации по умолчанию требует больше работы, чем простое преобразование структуры данных R в формат списка. list(area = 453:458, price = 1:6) |> jsonlite::toJSON()

4. @KentOrr Я попробую со списком. Спасибо

5. Я думаю, что комментарий @KentOrr намного лучше, чем отключить сериализацию по умолчанию и сделать это самостоятельно. Гораздо более прямой и элегантный.

Ответ №1:

json и jsonlite упаковка более легко поддается list формату. Возможно, изменение сериализации по умолчанию-это больше работы, чем простое преобразование структуры данных R в соответствие.

Я бы предложил что-то вроде

 df_t<-data.frame(c(453:458),c(1:6), row.names = NULL)
colnames(df_t) <- c("area", "price")

df_t_list <- list()
for(i in 1:ncol(df_t)) {
  df_t_list[[i]] <- df_t[ , i]
}
names(df_t_list) <- c("area", "price")

jsonlite::toJSON(df_t_list)