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:

Code: Alles auswählen

df[ave(df$V2, df$Proband, df$V2, FUN=length)>=2,]
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:

Code: Alles auswählen

'+'(3, 4)
'<-'(x, 11:15)
'['(x, 3)
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:

Code: Alles auswählen

'+'(3, 4)
'<-'(x, 11:15)
'['(x, 3)
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:

Code: Alles auswählen

'<-'(x, ':'(11, 15))
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:

Code: Alles auswählen

'+'(3, 4)
'<-'(x, 11:15)
'['(x, 3)
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:

Code: Alles auswählen

'<-'(x, ':'(11, 15))
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 :mrgreen:

Das Diagramm ist auch interessant:
von den Programmiersprachen, mit denen ich je zu tun gehabt habe, steht am weitesten links unten: m4 :shock:

Gruß, Jörg