ListeinListe daten extraieren

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Karo
Beiträge: 4
Registriert: So Jan 12, 2020 4:56 pm

ListeinListe daten extraieren

Beitrag 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
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: ListeinListe daten extraieren

Beitrag 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

Code: Alles auswählen

dput(DeineObjekt)
posten - bitte auch viewtopic.php?f=20&t=29 beachten.

Gruß, Jörg
Karo
Beiträge: 4
Registriert: So Jan 12, 2020 4:56 pm

Re: ListeinListe daten extraieren

Beitrag 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!
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: ListeinListe daten extraieren

Beitrag 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

Code: Alles auswählen

my_function(3) ## oder auch von
str(my_function(3))
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
Antworten