Seite 1 von 1
ListeinListe daten extraieren
Verfasst: Mo Apr 20, 2020 1:13 am
von Karo
Hallo zusammen
ich hab eine Liste die besteht aus 9 Seiten.
page: int 1
results: data.frame: 20 obs. of 14 variables
..$ popularity: num [1:20]
..$ id: int [1:20]
.. $ genre_ids: List of 20
.. ..$: int [1:4]
.. ..$: int [1:5]
etc.
..$ title: chr [1:20]
Page: int 2
results: data.frame: 20 obs. of 14 variables
..$ popularity: num [1:20]
..$ id: int [1:20]
.. $ genre_ids: List of 20
.. ..$: int [1:4]
.. ..$: int [1:5]
etc.
..$ title: chr [1:20]
usw bis Seite 9
Ich wollte die ganzen Daten mit
map(purrr::pluck, "popularity", "id")
purrr::flatten()
magrittr::extract()
mit einer Pipe rausfiltern und in eine einzige Liste packen, aber irgendwie komme ich nicht vom Fleck.
Hat mir jemand einen Tipp?
merci, Karo
Re: ListeinListe daten extraieren
Verfasst: Mo Apr 20, 2020 8:58 am
von jogo
Hallo Karo,
Karo hat geschrieben: Mo Apr 20, 2020 1:13 am
ich hab eine Liste die besteht aus 9 Seiten.
page: int 1
results: data.frame: 20 obs. of 14 variables
..$ popularity: num [1:20]
..$ id: int [1:20]
...
ist das Objekt wirklich eine Liste?
Bei einer Liste müsste dort stehen:
Code: Alles auswählen
List of 9
$ page : int 1
$ results : data.frame: 20 obs. of 14 variables
..$ popularity: num [1:20]
..$ id: int [1:20]
...
und warum heißt es bei Dir einmal
page und beim zweiten Teil
Page
Das beste wäre, Du würdest den output von
posten - bitte auch
viewtopic.php?f=20&t=29 beachten.
Gruß, Jörg
Re: ListeinListe daten extraieren
Verfasst: Mo Apr 20, 2020 12:07 pm
von Karo
HI zusammen
ich versuche es mal besser zu erklären... sorry, war wohl etwas zu später Stunde...
Mittels einer Funktion hole ich alle Daten von einer API-DB
Code: Alles auswählen
my_function = function(id_)
{
return(fromJSON(paste0("https://api.themoviedb.org/3/discover/movie?api_key=myKey&language=en-US&sort_by=revenue.desc&include_adult=false&include_video=false&page=1&with_companies=3&with_runtime.gte=60&page=", id_), flatten = TRUE))
}
alldata_collect <-
lapply(1:9, my_function)
das gibt eine "zusammengeführte Liste":
Code: Alles auswählen
alldata_collect List of 9
: List of 4
..$ page: int 1
..$ results: 'data.frame': 20 obs. of 14 variables:
.. ..$ popularity: num [1:20] 41.6 50.3 31.6. 17.4. etc....
.. ..$ id: int [1:20] 260513 301528 10193 etc...
.. .. ..$ : int [1:4] 28 12 16 etc.
:List of 4
..$ page: int 2
..$ results: 'data.frame': 3 obs. of 14 variables:
.. ..$ popularity: num [1:3] 17.4 143.1 10.6
.. ..$ id: int [1:3] 105864 508439 16187
.. .. ..$ : int [1:3] 12 16 10751
:List of 4
..$ page: int 3
..$ results : list()
:List of 4
..$ page: int 4
..$ results : list()
usw.
irgendwie merke ich gerade beim abschreiben meiner Daten, dass es mir nur die ersten beiden Seiten ins alldata_collect geschrieben hat und der Rest ist irgendwie leer. oder verstehe ich list() falsch? kann lapply nur 2 Seiten zusammenführen?
eigentlich wollte ich die Daten dann rausnehmen und eine Liste daraus machen:
Code: Alles auswählen
alldata <- alldata_collect %>%
map(purrr::pluck, "popularity", "id") %>%
purrr::flatten() %>%
magrittr::extract()
Kann mir jemand einen Hinweis geben? DANKE!
Re: ListeinListe daten extraieren
Verfasst: Mo Apr 20, 2020 1:45 pm
von jogo
Hallo Karo,
Karo hat geschrieben: Mo Apr 20, 2020 12:07 pm
Code: Alles auswählen
my_function = function(id_)
{
return(fromJSON(paste0("https://api.themoviedb.org/3/discover/movie?api_key=myKey&language=en-US&sort_by=revenue.desc&include_adult=false&include_video=false&page=1&with_companies=3&with_runtime.gte=60&page=", id_), flatten = TRUE))
}
alldata_collect <-
lapply(1:9, my_function)
das gibt eine "zusammengeführte Liste":
...
irgendwie merke ich gerade beim abschreiben meiner Daten, dass es mir nur die ersten beiden Seiten ins alldata_collect geschrieben hat und der Rest ist irgendwie leer. oder verstehe ich list() falsch? kann lapply nur 2 Seiten zusammenführen?
also, am lapply() liegt es nicht. Wahrscheinlich liefert Deine Funktion my_function() für Werte größer als 2 eine leere Liste. Schau Dir doch das Ergebnis an von
eigentlich wollte ich die Daten dann rausnehmen und eine Liste daraus machen:
Code: Alles auswählen
alldata <- alldata_collect %>%
map(purrr::pluck, "popularity", "id") %>%
purrr::flatten() %>%
magrittr::extract()
Hier kann ich nur mit Unwissenheit glänzen. Ich würde das mit
base R lösen;
da gibt es do.call() und Reduce().
Ein kleines Beispiel:
Code: Alles auswählen
L <- list(list(page=1, result=BOD), list(page=2, result=BOD), list(page=3, result=BOD))
do.call(rbind, lapply(L, '[[', 2)) ## oder
Reduce(rbind, lapply(L, '[[', "result"))
oder die Luxusvariante:
Code: Alles auswählen
mybind <- function(d) cbind(page=d$page, d$result)
Reduce(rbind, lapply(L, mybind))
Gruß, Jörg