Output weniger Elemente als Input

For(), If(), While() und Verwandte. Diskussion von programmiertechnischen Fragen.

Output weniger Elemente als Input

Beitragvon Joseph10 » Fr 20. Mai 2016, 10:27

Guten Morgen,

folgendes Problem: habe einen dataframe mit x Spalten, benötige jedoch daraus nur y Spalten in Abhängigkeit einer bestimmten Bedingung. y < x. Frage: wie kann ich dies elegant nur mit einer Schleife lösen? lapply gibt mir per Definition genauso viel Spalten wie x zurück, im Fall der nicht-erfüllten Nebenbedingung ist das entsprechende Listenelement NULL, aber die Ergebnisliste von Lapply hat eben trotzdem x Komponenten. Somit kann ich dann erst recht wieder die NULL Elemente der Ergebnisliste mittels Schleife löschen. Auf der anderen Seite weiß ich im Vorhin nicht, wieviele y Spalten existieren, daher kann ich auch im Vorhinein nur einen Vektor mit x Spalten definieren, dann mittels FOR Schleife y Spalten füllen und dann die überzähligen löschen.

Gibt es da etwas eleganteres, zB ein lapply wobei aber nicht für jedes Inputelement zwangsläufig ein Outputelement erzeugt wird?

Danke sehr
Joseph10
 
Beiträge: 4
Registriert: Fr 20. Mai 2016, 10:14
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Output weniger Elemente als Input

Beitragvon tau1234 » Sa 21. Mai 2016, 13:49

hey :)

könntest du die frage vielleicht etwas spezifizieren. also am besten mit einem ausschnitt des datensatzes und auch der bedingung. wie sieht der datensatz vorher aus? wie soll er danach aussehen? ich glaube dann ist es einfacher eine lösung zu finden.

grüße
tau1234
 
Beiträge: 60
Registriert: Mi 4. Mai 2016, 11:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Output weniger Elemente als Input

Beitragvon Joseph10 » Di 24. Mai 2016, 17:58

danke.

also: datensatz vorher: data.frame mit 7000 Zeilen und 300 Spalten; jede Spalte besteht aus Prozentsätzen zwischen 0 und 100%, welche pro Zeile variieren. nun ist die Idee, pro Spalte nur die Zeilen herauszufiltern, welche einen Wert über 10% aufweisen. Viele Spalten werden gar keinen Eintrag über 10% haben, daher wird in solch einem Fall die komplette Spalte negiert.

Ich habe es vorläufig mit einem Lapply über die Spalten gemacht, wobei dann zwangsläufig das Resultat eine Liste mit der Anzahl sämtlicher Spalten des Datensatzes ist, aber in den Fällen, in welchen kein Prozentsatz über 10% ist, ist die entsprechende Listenkomponente daher NULL (vielen Spalten des Ursprungsdatensatzes enthalten keine Werte über 10%), in allen anderen Fällen enthält die Listenkomponente eben nur die Zeilen der entsprechenden Spalte mit den Werten > 10%.

elegant wäre jedoch, von vorn herein nur die Spalten mit Inhalt ungleich NULL auszugeben.

Ist das ein bisschen verständlicher?

danke sehr
Joseph10
 
Beiträge: 4
Registriert: Fr 20. Mai 2016, 10:14
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Output weniger Elemente als Input

Beitragvon tau1234 » Mi 25. Mai 2016, 09:09

hii,

ja, ich denke jetzt weiß ich, was du meinst.

also ich weiß jetzt nicht ob meine Lösung wahnsinnig elegant ist, aber man behält zumindest in der Liste nur die Spalten, die in der Liste nicht leer sind. Wenn ich einen data.frame z habe und dann das lapply auf z anwende bekomme ich eine liste:
$V1
[1] 1 2 3 4 5 6 7 8 9 10

$V2
integer(0)

$V3
[1] 1 2 3 4 6 7 8 9 10

$V4
[1] 1 2 3 5 6 7 8 9 10

$V5
[1] 2 3 4 5 6 7 8 9 10

die sieht dann bspw. so aus. wir haben also einen eintrag, der unbefüllt ist. um diesen zu löschen mache ich dann:
z[lapply(z,length)>0]

ich hoffe mal, das ist das was du suchst.

Gruß
tau1234
 
Beiträge: 60
Registriert: Mi 4. Mai 2016, 11:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Output weniger Elemente als Input

Beitragvon Joseph10 » Mi 25. Mai 2016, 09:46

super, danke sehr. erspart zwar nicht ein zweimaliges lapply, aber ist trotzdem sehr elegant.
Joseph10
 
Beiträge: 4
Registriert: Fr 20. Mai 2016, 10:14
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Programmierkonzepte

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron