Как я могу извлечь список списков в один фрейм данных (в идеале по именам ссылок)? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть список списков:

> dput(results)
list(list(type = "sales", value = 9L, all_time_value = 833L), 
    list(type = "gmv", value = 3644.21716861478, all_time_value = 344375.321075978), 
    list(type = "aov", value = 404.913018734976, all_time_value = 413.415751591811), 
    list(type = "acr", value = 0.108433734939759, all_time_value = 0.149283154121864), 
    list(type = "initiated-chats", value = 89L, all_time_value = 10299L), 
    list(type = "chats-claimed", value = 82L, all_time_value = 5497L), 
    list(type = "chats-per-available-user", value = 3.15384615384615, 
        all_time_value = 57.2604166666667), list(type = "rating", 
        value = 5L, all_time_value = 4.58640776699029))

Что структурировано так:

> library(dplyr)
> results %>% str
List of 8
 $ :List of 3
  ..$ type          : chr "sales"
  ..$ value         : int 9
  ..$ all_time_value: int 833
 $ :List of 3
  ..$ type          : chr "gmv"
  ..$ value         : num 3644
  ..$ all_time_value: num 344375
 $ :List of 3
  ..$ type          : chr "aov"
  ..$ value         : num 405
  ..$ all_time_value: num 413
 $ :List of 3
  ..$ type          : chr "acr"
  ..$ value         : num 0.108
  ..$ all_time_value: num 0.149
 $ :List of 3
  ..$ type          : chr "initiated-chats"
  ..$ value         : int 89
  ..$ all_time_value: int 10299
 $ :List of 3
  ..$ type          : chr "chats-claimed"
  ..$ value         : int 82
  ..$ all_time_value: int 5497
 $ :List of 3
  ..$ type          : chr "chats-per-available-user"
  ..$ value         : num 3.15
  ..$ all_time_value: num 57.3
 $ :List of 3
  ..$ type          : chr "rating"
  ..$ value         : int 5
  ..$ all_time_value: num 4.59

Этот список извлекается из бэкэнд-системы и всегда будет содержать одни и те же метрики, но эти значения могут не всегда входить в этом конкретном порядке.

Я хочу извлечь элементы каждого списка в один фрейм данных, состоящий из трех строк (type, value, all_time_value) и восьми столбцов, причем каждый столбец имеет имя в соответствии с соответствующим значением в $ type.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

rbindlist может быть более эффективным, попробуйте data.frame(t(data.table::rbindlist(results))).

# or with the columns name
df <- data.frame(t(data.table::rbindlist(results)))
df <- setNames(df[-1, ], sapply(df[1, ], as.character))

# output
                      sales          gmv          aov          acr initiated-chats chats-claimed chats-per-available-user       rating
value             9.0000000 3644.2171686  404.9130187    0.1084337      89.0000000    82.0000000                3.1538462    5.0000000
all_time_value 8.330000e+02 3.443753e+05 4.134158e+02 1.492832e-01    1.029900e+04  5.497000e+03  

       5.726042e+01 4.586408e+00
0 голосов
/ 09 ноября 2018

Сначала сведите все это в data.frame.

df <- do.call("rbind.data.frame", lapply(results, as.data.frame))

затем переверните его

t(df)

Подход «все в одном»:

df <- t(do.call("rbind.data.frame", lapply(results, as.data.frame)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...