#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)