Daten filtern

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

Moderatoren: EDi, jogo

Antworten
FridaKoriander
Beiträge: 37
Registriert: Do Dez 01, 2016 9:08 pm

Daten filtern

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Daten filtern

Beitrag 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
FridaKoriander
Beiträge: 37
Registriert: Do Dez 01, 2016 9:08 pm

Re: Daten filtern

Beitrag 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...?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Daten filtern

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Daten filtern

Beitrag 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/
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Daten filtern

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Daten filtern

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Daten filtern

Beitrag 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
Antworten