Seite 1 von 1
Daten filtern
Verfasst: Mo Jun 11, 2018 11:09 am
von FridaKoriander
Hallo zusammen,
ich habe einen dataframe mit folgendem Format:
Code: Alles auswählen
Proband V1 V2
1 A 3
1 B 6
1 C 8
2 A 4
2 B 5
2 C 5
3 A 7
3 B 1
3 C 9
Ich möchte nun Fälle filtern, in denen die Variable V2 in den jeweiligen Bedingungen von Variable V1 gleich sind, und zwar unterteilt nach Proband. Also im Beispiel bei Proband 2 ist V2 in den Bedingungen B und C von V1 gleich, und solche Fälle möchte ich filtern. Hätte jemand hierfür eine Idee? Ich hoffe, ich habe das Problem verständlich dargestellt. Besten Dank schon mal im Voraus!
Grüße
Frida
Re: Daten filtern
Verfasst: Mo Jun 11, 2018 1:02 pm
von jogo
Hallo Frida,
suchst Du so etwas:
Code: Alles auswählen
df <- read.table(header=TRUE, stringsAsFactors = FALSE, text=
"Proband V1 V2
1 A 3
1 B 6
1 C 8
2 A 4
2 B 5
2 C 5
3 A 7
3 B 1
3 C 9")
df$n <- ave(df$V2, df$Proband, df$V2, FUN=length)
subset(df, n>=2)
Dies ist die Kurzform:
Oder mit
data.table:
Code: Alles auswählen
library("data.table")
Text=
"Proband V1 V2
1 A 3
1 B 6
1 C 8
2 A 4
2 B 5
2 C 5
3 A 7
3 B 1
3 C 9"
df <- fread(input=gsub("\t+", "\t", Text))
df[, n :=.N, .(Proband, V2)][n>=2]
Gruß, Jörg
Re: Daten filtern
Verfasst: Mo Jun 11, 2018 1:59 pm
von FridaKoriander
Hi Jörg,
vielen Dank für Deine Antwort! Hm, leider funktioniert das bei meinen Daten nicht so recht. V1 hat eine Range von 2-15 und V2 eine Range von 1-9...gibt es die Möglichkeit, das über eine if-Schleife zu lösen...?
Re: Daten filtern
Verfasst: Mo Jun 11, 2018 3:55 pm
von jogo
Hallo Frida,
FridaKoriander hat geschrieben: ↑Mo Jun 11, 2018 1:59 pm
vielen Dank für Deine Antwort! Hm, leider funktioniert das bei meinen Daten nicht so recht.
was meinst Du damit?
V1 hat eine Range von 2-15 und V2 eine Range von 1-9...gibt es die Möglichkeit, das über eine if-Schleife zu lösen...?
Ich habe doch die ranges bei meiner Lösung gar nicht verwendet.
Nachtrag:
In einem minimalistischen Ansatz einer 3G-Programmiersprache reichen die Konstrukte
while-Schleife und
if ... then ... else völlig aus zur Steuerung des Programmablaufes. Die Programmierung wird dann (im Vergleich zu den in R vorhandenen Mitteln) reichlich ineffizient. Da mir aber ineffiziente Programmierung keinen Spaß macht, werde ich es auch nicht tun, solange es nicht zwingend notwendig ist. Bisher sehe ich diese zwingende Notwendigkeit nicht - dafür hast Du einfach zu wenig von dem umfassenderen Ziel der Programmierung geschrieben.
Gruß, Jörg
Re: Daten filtern
Verfasst: Mo Jun 11, 2018 10:43 pm
von bigben
FridaKoriander hat geschrieben: ↑Mo Jun 11, 2018 1:59 pmgibt es die Möglichkeit, das über eine if-Schleife zu lösen...?
siehe auch:
http://www.if-schleife.de/
Re: Daten filtern
Verfasst: Di Jun 12, 2018 11:04 am
von jogo
Ob Schleife oder nicht - es ist sowieso alles Funktionsaufruf:
Code: Alles auswählen
for (i in 1:5) print(i)
'for'(i, 1:5, print(i))
i <- 42
if (i==9) print("neun") else print("anders")
'if'(i==9, print("neun"), print("anders"))
Das sieht bestimmt lustig aus, wenn man konsequent den Programmierstil entsprechend umsetzt:
Gruß, Jörg
Re: Daten filtern
Verfasst: Di Jun 12, 2018 4:25 pm
von bigben
Hi!
jogo hat geschrieben: ↑Di Jun 12, 2018 11:04 amOb Schleife oder nicht - es ist sowieso alles Funktionsaufruf:
Selbst wenn beides eine Funktion ist, dann ist das eine doch eine Schleife und das andere nicht.
Das sieht bestimmt lustig aus, wenn man konsequent den Programmierstil entsprechend umsetzt:
Wenn man das konsequent so macht, nennt man das wohl LISP - und dass ist auch schon ein halbes Jahrhundert lang nicht tot zu kriegen. Unter dem aktuellen Namen Clojure steht das bei Redmonk ziemlich weit rechts oben (und Racket, Emacs Lisp, Common Lisp und Scheme stehen auch alle mit auf der Liste):
http://sogrady-media.redmonk.com/sograd ... k_.118.png Ist so abwegig also nicht.
https://imgs.xkcd.com/comics/lisp_cycles.png
A propos: Wenn wir schon praefix-Syntax wählen, dann müsstest Du aber konsequenterweise so schreiben:
LG,
Bernhard
Re: Daten filtern
Verfasst: Di Jun 12, 2018 8:29 pm
von jogo
bigben hat geschrieben: ↑Di Jun 12, 2018 4:25 pm
Hi!
jogo hat geschrieben: ↑Di Jun 12, 2018 11:04 amOb Schleife oder nicht - es ist sowieso alles Funktionsaufruf:
Selbst wenn beides eine Funktion ist, dann ist das eine doch eine Schleife und das andere nicht.
Das ist wohl war; ich wollte mal wieder der allgemeineren Idee nachhängen.
Das sieht bestimmt lustig aus, wenn man konsequent den Programmierstil entsprechend umsetzt:
Wenn man das konsequent so macht, nennt man das wohl LISP - und dass ist auch schon ein halbes Jahrhundert lang nicht tot zu kriegen. Unter dem aktuellen Namen Clojure steht das bei Redmonk ziemlich weit rechts oben (und Racket, Emacs Lisp, Common Lisp und Scheme stehen auch alle mit auf der Liste):
http://sogrady-media.redmonk.com/sograd ... k_.118.png Ist so abwegig also nicht.
https://imgs.xkcd.com/comics/lisp_cycles.png
A propos: Wenn wir schon praefix-Syntax wählen, dann müsstest Du aber konsequenterweise so schreiben:
ja, ich war noch nicht ganz konsequent - auch die anderen Beispiele müssen nochmal überarbeitet werden:
Code: Alles auswählen
for (i in 1:5) print(i)
'for'(i, 1:5, print(i))
'for'(i, ':'(1, 5), print(i))
i <- 42
if (i==9) print("neun") else print("anders")
'if'(i==9, print("neun"), print("anders"))
'if'('=='(i, 9), print("neun"), print("anders"))
Es ist schön, dass R derart flexibel ist. Und es zeigt auch, wie klar R konzipiert wurde.
BTW: ... schönes Comic-Bildchen
Das Diagramm ist auch interessant:
von den Programmiersprachen, mit denen ich je zu tun gehabt habe, steht am weitesten links unten:
m4
Gruß, Jörg