Очистить список от data.frame без имен из номеров строк - PullRequest
0 голосов
/ 12 июня 2018

Не знаю, как сформулировать мой вопрос кратко, но здесь все идет.

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

# load libraries
library(RJSONIO)

# make data
dt <- data.frame(var1 = 1:4, var2 = c("a", "b", "c", "d"), var3 = c("foo", "bar", "foobar", "foobaz"), var4 = c(100, 200, 300, 400))

# make nested list
ll <- apply(dt, 1, function(x) list(id = x[['var1']], props = list(name = x[['var2']], altName = x[['var3']], height = x[['var4']])))

# output to JSON and print
js <- toJSON(ll); cat(js)

# output
[
 {
 "id": "1",
"props": {
 "name": "a",
"altName": "foo",
"height": "100" 
} 
},
...

Все работает как положено.Но затем я хочу отфильтровать данные и по какой-то причине R вложит мой начальный список в объект, названный номером строки

# make nested list of dataframe from before but now filter on var1
dt <- dt[dt$var1 %% 2 == 0, ]
ll <- apply(dt, 1, function(x) list(id = x[['var1']], props = list(name = x[['var2']], altName = x[['var3']], height = x[['var4']])))

# output to JSON and print
js <- toJSON(ll); cat(js)

# output
 {
 "2": {
   "id": "1",
  "props": {
   "name": "a",
   "altName": "foo",
   "height": "100" 
  }
 } 
},
...

Теперь, с помощью unname() я могу удалить имена 2 и 4,но почему это происходит в первую очередь и есть ли способ предотвратить первоначальное именование списков?Как всегда, любая помощь приветствуется!

1 Ответ

0 голосов
/ 12 июня 2018

В основном получается, что у вас есть data.frame, который не был подмножеством, у него есть специальное свойство row-name, которое просто присваивает уникальный номер каждой строке.Но когда вы поднабор, это специальное значение нарушается.Обратите внимание, как он сохраняет исходный индекс 2 и 4

dt[dt$var1 %% 2 == 0, ]
#   var1 var2   var3 var4
# 2    2    b    bar  200
# 4    4    d foobaz  400

Это приводит к именам в вашем выводе.Вы можете избавиться от этих имен строк, как вы сделали с unname().Опять же, этого не происходит в заливке data.frame, потому что у них есть «магическое» значение, которое указывает на специальные имена для строк для экономии места в памяти.

Но запуск также может быть опаснымapply в data.frame со всеми возможными преобразованиями типов данных.Другой возможной стратегией является использование нескольких библиотек Tidyverse

library(tidyverse) # dplur, purrr, tidyr
library(jsonlite)
dt %>% 
  rename(id=var1, name=var2, altName=var3, height=var4) %>% 
  nest(-id, .key="props") %>% 
  mutate(props=map(props, unbox)) %>% 
  toJSON()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...