Extraer datos de una lista de listas en su propio `data.frame` con` purrr`

Datos de muestra representativos (lista de listas):

l <- list(structure(list(a = -1.54676469632688, b = "s", c = "T", 
d = structure(list(id = 5L, label = "Utah", link = "Asia/Anadyr", 
    score = -0.21104594634643), .Names = c("id", "label", 
"link", "score")), e = 49.1279871269422), .Names = c("a", 
"b", "c", "d", "e")), structure(list(a = -0.934821052832427, 
b = "k", c = "T", d = list(structure(list(id = 8L, label = "South Carolina", 
    link = "Pacific/Wallis", score = 0.526540892113734, externalId = -6.74354377676955), .Names = c("id", 
"label", "link", "score", "externalId")), structure(list(
    id = 9L, label = "Nebraska", link = "America/Scoresbysund", 
    score = 0.250895465294041, externalId = 16.4257470807879), .Names = c("id", 
"label", "link", "score", "externalId"))), e = 52.3161400117052), .Names = c("a", 
"b", "c", "d", "e")), structure(list(a = -0.27261485993069, b = "f", 
c = "P", d = list(structure(list(id = 8L, label = "Georgia", 
    link = "America/Nome", score = 0.526494135483816, externalId = 7.91583574935589), .Names = c("id", 
"label", "link", "score", "externalId")), structure(list(
    id = 2L, label = "Washington", link = "America/Shiprock", 
    score = -0.555186440792989, externalId = 15.0686663219837), .Names = c("id", 
"label", "link", "score", "externalId")), structure(list(
    id = 6L, label = "North Dakota", link = "Universal", 
    score = 1.03168296038975), .Names = c("id", "label", 
"link", "score")), structure(list(id = 1L, label = "New Hampshire", 
    link = "America/Cordoba", score = 1.21582056168681, externalId = 9.7276418869132), .Names = c("id", 
"label", "link", "score", "externalId")), structure(list(
    id = 1L, label = "Alaska", link = "Asia/Istanbul", score = -0.23183264861979), .Names = c("id", 
"label", "link", "score")), structure(list(id = 4L, label = "Pennsylvania", 
    link = "Africa/Dar_es_Salaam", score = 0.590245339334121), .Names = c("id", 
"label", "link", "score"))), e = 132.1153538536), .Names = c("a", 
"b", "c", "d", "e")), structure(list(a = 0.202685974077313, b = "x", 
c = "O", d = structure(list(id = 3L, label = "Delaware", 
    link = "Asia/Samarkand", score = 0.695577130634724, externalId = 15.2364820698193), .Names = c("id", 
"label", "link", "score", "externalId")), e = 97.9908914452971), .Names = c("a", 
"b", "c", "d", "e")), structure(list(a = -0.396243444741009, 
b = "z", c = "P", d = list(structure(list(id = 4L, label = "North Dakota", 
    link = "America/Tortola", score = 1.03060272795705, externalId = -7.21666936522344), .Names = c("id", 
"label", "link", "score", "externalId")), structure(list(
    id = 9L, label = "Nebraska", link = "America/Ojinaga", 
    score = -1.11397997280413, externalId = -8.45145052697411), .Names = c("id", 
"label", "link", "score", "externalId"))), e = 123.597945533926), .Names = c("a", 
"b", "c", "d", "e")))

Tengo una lista de listas, en virtud de una descarga de datos JSON.

La lista tiene 176 elementos, cada uno con 33 elementos anidados, algunos de los cuales también son listas de longitud variable.

Estoy interesado en analizar los datos contenidos en una lista anidada particular, que tiene una longitud de ~ 150 para cada uno de los 176 que tiene 4 o 5 elementos, algunos tienen 4 y otros tienen 5. Estoy tratando de extraer esto anidado lista de intereses y convertirla en unadata.frame para poder realizar algunos análisis.

En los datos de muestra representativos anteriores, estoy interesado en la lista anidadad para cada uno de los 5 elementos del. El deseadodata.frame por lo tanto, se vería algo así como:

id           label            link       score  externalId
 5            Utah     Asia/Anadyr  -0.2110459          NA
 8  South Carolina  Pacific/Wallis   0.5265409   -6.743544
 .
 .

He estado intentando usarpurrr que parece tener un flujo sensible y consistente para procesar datos en listas, pero me encuentro con errores de los que no puedo entender completamente la causa; podría muy bien ser que no entiendo correctamente los comandos / lógica depurrr o listas (probablemente ambas). Este es el código que he estado intentando pero arroja el error asociado:

df <- map_df(l, "d", ~as.data.frame(.))
Error: incompatible sizes (5 != 4)

Creo que esto tiene que ver con las diferentes longitudes ded para cada componente, o tal vez los diferentes datos contenidos (a veces 4 elementos, a veces 5) o tal vez la función que he usado aquí está mal especificada; sinceramente, no estoy completamente seguro.

He trabajado alrededor de esto usando un bucle for, que sé que es ineficiente y de ahí mi pregunta aquí sobre SO.

Este es el ciclo for que uso actualmente:

df <- data.frame(id = integer(), label = character(), score = numeric(), externalId = numeric())
for(i in seq_along(l)){
    df_temp <- l[[i]][[4]] %>% map_df(~as.data.frame(.))
    df <- rbind(df, df_temp)
}

Alguna ayuda preferiblemente conpurrr - alternativamente alguna versión deapply Como esto es aún superior a mi for-loop, sería muy apreciado. Además, si hay un recurso para lo anterior, me gustaría entender en lugar de solo encontrar el código correcto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta