elementweises Dividieren zweier Listen

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

Moderatoren: EDi, jogo

Bill
Beiträge: 35
Registriert: Fr Mär 06, 2020 8:04 pm

elementweises Dividieren zweier Listen

Beitrag von Bill »

Hallo Leute,

ich wollte eine Liste durch eine andere Liste elementweise dividieren.
Beide Listen haben a) die selbe Anzahl von Elementen und b) jedes Element ist auch vom selben Typ.

Zum Beispiel so hier:

Code: Alles auswählen

 > Liste1 <- list(8,32,11)
> Liste2 <- list(99,45,12)
> Liste1/Liste2
Fehler in Liste1/Liste2 : nicht-numerisches Argument für binären Operator
>  
Ich will die Listen auch nicht in Vektoren oder ähnliches umwandeln. Wie könnte ich trotzdem eine elementweise stattfindende Division erreichen?

Danke im voraus und

liebe Grüße

Bill
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: elementweises Dividieren zweier Listen

Beitrag von bigben »

Und wenn man die Umwandlung in einen Vektor in einer Funktion versteckt, sodass keiner sie sieht?

Code: Alles auswählen

Liste1 <- list(8,32,11)
Liste2 <- list(99,45,12)

listdiv <- function(divident, divisor)
  as.list(unlist(divident) / unlist(divisor))


`%durch%` <- listdiv

listdiv(Liste1, Liste2)

Liste1 %durch% Liste2
Das Ergebnis ist wieder eine Liste, es hat also keiner gesehen.
Ansonsten ein schönes Beispiel für eine for-Schleife:

Code: Alles auswählen

Liste3 <- list()
for(i in 1:length(Liste1))
  Liste3[[i]] <- Liste1[[i]] / Liste2[[i]]
und wenn Du unbeding tneue Funktionen in R lernen willst geht natürlich auch

Code: Alles auswählen

mapply('/', Liste1, Liste2, SIMPLIFY=FALSE)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: elementweises Dividieren zweier Listen

Beitrag von EDi »

oder mit purrr (das gleiche wie mapply):

Code: Alles auswählen

purrr::map2(Liste1, Liste2, ~.x / .y)
purrr::map2(Liste1, Liste2, `/`)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: elementweises Dividieren zweier Listen

Beitrag von EDi »

Oder mit lapply (das gleiche wie die Schleife):

Code: Alles auswählen

lapply(seq_along(Liste1), function(i) Liste1[[i]] / Liste2[[i]])
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: elementweises Dividieren zweier Listen

Beitrag von EDi »

base::Map() geht auch (ist auch nur ein wrapper für mapply):

Code: Alles auswählen

base::Map(`/`, Liste1, Liste2)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: elementweises Dividieren zweier Listen

Beitrag von jogo »

es mag etwas speziell sein, aber Du hast kein anspruchsvolleres Beispiel geliefert:

Code: Alles auswählen

unlist(Liste1)/unlist(Liste2)
Gruß, Jörg
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: elementweises Dividieren zweier Listen

Beitrag von EDi »

jogo hat geschrieben: Do Apr 30, 2020 11:37 pm es mag etwas speziell sein, aber Du hast kein anspruchsvolleres Beispiel geliefert:

Code: Alles auswählen

unlist(Liste1)/unlist(Liste2)
Gruß, Jörg
Ich will die Listen auch nicht in Vektoren oder ähnliches umwandeln.
Das zählt nicht jogo :P
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Bill
Beiträge: 35
Registriert: Fr Mär 06, 2020 8:04 pm

Re: elementweises Dividieren zweier Listen

Beitrag von Bill »

Hallo Leute,

@jogo ich wollte die Liste ja nicht "entlisten" :lol:


Also die Versionen mit mapply oder aber auch mit map gefallen mir, danke euch dafür.

P.S.: Was ist eigentlich ein Wrapper?

Liebe Grüße

Bill
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: elementweises Dividieren zweier Listen

Beitrag von bigben »

to wrap heißt einwickeln, also eine Funktion, die nur eine dünne Schicht über eine andere ist. Oft eine Funktion, die nur den Aufruf der anderen Funktion leichter/schöner/passender machen soll.

Meine Funktion listdiv oben erledigt Deine Rechenaufgabe. Meine Funktion %durch% fügt dem inhaltlich nicht viel hinzu, sondern erlaubt nur eine andere Syntax beim Aufruf. Das wäre ein banales Beispiel für einen sehr dünnen Wrapper / eine sehr dünne wrapper function.

LG,Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: elementweises Dividieren zweier Listen

Beitrag von bigben »

Bill hat geschrieben: Fr Mai 01, 2020 12:33 am aber auch mit map gefallen mir, danke euch dafür.
Cave: EDi hat Map mit großem M geschrieben und so auch gemeint!
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten