Seite 1 von 2

elementweises Dividieren zweier Listen

Verfasst: Do Apr 30, 2020 8:47 pm
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

Re: elementweises Dividieren zweier Listen

Verfasst: Do Apr 30, 2020 9:10 pm
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

Re: elementweises Dividieren zweier Listen

Verfasst: Do Apr 30, 2020 9:54 pm
von EDi
oder mit purrr (das gleiche wie mapply):

Code: Alles auswählen

purrr::map2(Liste1, Liste2, ~.x / .y)
purrr::map2(Liste1, Liste2, `/`)

Re: elementweises Dividieren zweier Listen

Verfasst: Do Apr 30, 2020 9:58 pm
von EDi
Oder mit lapply (das gleiche wie die Schleife):

Code: Alles auswählen

lapply(seq_along(Liste1), function(i) Liste1[[i]] / Liste2[[i]])

Re: elementweises Dividieren zweier Listen

Verfasst: Do Apr 30, 2020 10:03 pm
von EDi
base::Map() geht auch (ist auch nur ein wrapper für mapply):

Code: Alles auswählen

base::Map(`/`, Liste1, Liste2)

Re: elementweises Dividieren zweier Listen

Verfasst: Do Apr 30, 2020 11:37 pm
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

Re: elementweises Dividieren zweier Listen

Verfasst: Fr Mai 01, 2020 12:14 am
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

Re: elementweises Dividieren zweier Listen

Verfasst: Fr Mai 01, 2020 12:33 am
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

Re: elementweises Dividieren zweier Listen

Verfasst: Fr Mai 01, 2020 8:01 am
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

Re: elementweises Dividieren zweier Listen

Verfasst: Fr Mai 01, 2020 8:04 am
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!