gruppierte Variable

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
zinbu
Beiträge: 22
Registriert: Fr Mai 08, 2020 10:38 am

gruppierte Variable

Beitrag von zinbu »

Hallo zusammen,

ich kämpfe zurzeit mit einem großen Datensatz, den ich modifizieren muss...
So in etwa sieht er bisher aus

Code: Alles auswählen

> str(df)
'data.frame':	25 obs. of  4 variables:
 $ buchstabe: chr  "a" "b" "b" "d" ...
 $ zahl     : num  14 15 71 13 345 534 346 362 24 4 ...
 $ essen    : chr  "qq" "ww" "ff" "aa" ...
 $ nein     : num  3 1 3 1 3 3 3 3 3 1 ...
Ich möchte nun für jeden Wert meiner Variable "buchstabe" überprüfen, ob er in der Variablen "nein" irgnedwann mal den Wert 1 annimmt. Das will ich dann in einer neuen Spalte eintragen. Also sollen zb alle "b" 1 bekommen..
Ungefähr so: df$nein_kommt_vor : 3 1 1 1 3 3 3 3 3 1 1

Bisher habe ich nur

Code: Alles auswählen

df$nein_kommt_vor<-ifelse(df$nein==3,"3","1")
versucht, was aber nicht die teilweise gleichen "buchstabe" berücksichtigt...

Sorry für die vielleicht unübersichtliche Formulierung

Danke schonmal
Lg
bigben
Beiträge: 2780
Registriert: Mi Okt 12, 2016 9:09 am

Re: gruppierte Variable

Beitrag von bigben »

zinbu hat geschrieben: Do Mai 28, 2020 9:48 am Ich möchte nun für jeden Wert meiner Variable "buchstabe" überprüfen, ob er in der Variablen "nein" irgnedwann mal den Wert 1 annimmt. Das will ich dann in einer neuen Spalte eintragen.
Was soll passieren, wenn Nein nicht 1 wird? Ist die neue Spalte dann immer 3 oder immer der kleinste vorkommende Wert oder immer der größte oder?
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
zinbu
Beiträge: 22
Registriert: Fr Mai 08, 2020 10:38 am

Re: gruppierte Variable

Beitrag von zinbu »

ja genau. Wenn ein "buchstabe" nie 1 beinhaltet sollen alle werte des "buchstaben" 3 bleiben, andernfalls immer 1 werden. Sodass ich am Ende 2 Gruppen von Buchstaben machen kann - Buchstaben, bei denen irgendwann mal "1" genannt wird, und solche die nie "1" sind.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: gruppierte Variable

Beitrag von jogo »

Hallo zinbu,

die Aufgabe lässt sich m.E. mit ave() lösen.
Kannst Du von dem kleinen Beispieldatensatz den output von

Code: Alles auswählen

dput(df)
in Deine nächste Nachricht kopieren?

Gruß, Jörg
zinbu
Beiträge: 22
Registriert: Fr Mai 08, 2020 10:38 am

Re: gruppierte Variable

Beitrag von zinbu »

Hallo Jörg,

Code: Alles auswählen

> dput(df)
structure(list(buchstabe = c("a", "b", "b", "d", "e", "f", "g", 
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "p", "b", "d", 
"d", "d", "d", "q", "q"), zahl = c(14, 15, 71, 13, 345, 534, 
346, 362, 24, 4, NA, 7, 4, 2, 14, 345, 345, 456, 65, 13, 13, 
13, 13, 13, 13), essen = c("qq", "ww", "ff", "aa", "vv", "jj", 
"kk", "ii", "ww", "mm", "nn", "bb", "vv", "cc", "xx", "oo", "jj", 
"hh", "gg", "aa", "rr", "tt", "zz", "uu", "ii"), nein = c(3, 
1, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 
3, 1, 3)), row.names = c(NA, 25L), class = "data.frame")
ich hatte schon überlegt, ob ich was mit group_by(buchstabe,..) anfangen kann, aber das geht ja wohl nicht mit Charakter Vektoren..
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: gruppierte Variable

Beitrag von jogo »

Hallo zinbu,

schau mal, ob dies passt:

Code: Alles auswählen

df <- structure(list(
  buchstabe = c("a", "b", "b", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "p", "b", "d", "d", "d", "d", "q", "q"), 
  zahl = c(14, 15, 71, 13, 345, 534, 346, 362, 24, 4, NA, 7, 4, 2, 14, 345, 345, 456, 65, 13, 13, 13, 13, 13, 13), 
  essen = c("qq", "ww", "ff", "aa", "vv", "jj", "kk", "ii", "ww", "mm", "nn", "bb", "vv", "cc", "xx", "oo", "jj", "hh", "gg", "aa", "rr", "tt", "zz", "uu", "ii"), 
  nein = c(3, 1, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 1, 3)), row.names = c(NA, 25L), class = "data.frame")

df$nein_kommt_vor <- ave(df$nein, df$buchstabe, FUN=function(x) if(any(x==3)) "3" else "1") 
df

split(df, df$buchstabe) ## Kontrolle
zinbu hat geschrieben: Do Mai 28, 2020 1:53 pm ich hatte schon überlegt, ob ich was mit group_by(buchstabe,..) anfangen kann, aber das geht ja wohl nicht mit Charakter Vektoren..
Das weiß ich so schnell nicht; ich ging jetzt erstmal von base R aus.

Gruß, Jörg
zinbu
Beiträge: 22
Registriert: Fr Mai 08, 2020 10:38 am

Re: gruppierte Variable

Beitrag von zinbu »

Perfekt, danke dir!

Code: Alles auswählen

df$nein_kommt_vor <- ave(df$nein, df$buchstabe, FUN=function(x) if(any(x==3)) "3" else "1")
mit

Code: Alles auswählen

.....x==1))"1" else "3"
funktioniert alles so wie ich es haben will :)

Lg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: gruppierte Variable

Beitrag von jogo »

oh, schön.
Hier ist noch die data.table-Variante:

Code: Alles auswählen

library("data.table")

df <- structure(list(
  buchstabe = c("a", "b", "b", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "p", "b", "d", "d", "d", "d", "q", "q"), 
  zahl = c(14, 15, 71, 13, 345, 534, 346, 362, 24, 4, NA, 7, 4, 2, 14, 345, 345, 456, 65, 13, 13, 13, 13, 13, 13), 
  essen = c("qq", "ww", "ff", "aa", "vv", "jj", "kk", "ii", "ww", "mm", "nn", "bb", "vv", "cc", "xx", "oo", "jj", "hh", "gg", "aa", "rr", "tt", "zz", "uu", "ii"), 
  nein = c(3, 1, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 1, 3)), row.names = c(NA, 25L), class = "data.frame")
###
setDT(df)
df[, nein_kommt_vor:= if(any(nein==3)) "1" else "3", buchstabe]
Du hattest ja geschrieben, dass Dein Datensatz etwas größer ist ...

Wenn Du auf die spezielle Art der Kodierung des Ergebnisses verzichten kannst, geht auch:

Code: Alles auswählen

df[, nein_kommt_vor:= any(nein==3), buchstabe]
Gruß, Jörg
zinbu
Beiträge: 22
Registriert: Fr Mai 08, 2020 10:38 am

Re: gruppierte Variable

Beitrag von zinbu »

Wenn ich noch eine zweite Bedingung mit in ifelse() aufnehmen möchte, brauche ich einen anderen Ansatz oder lässt sich das einfach erweitern?
Angenommen ich möchte "1" nur angezeigt bekommen, wenn zusätzlich zu den bisherigen Bedingungen auch noch der Wert in df$zahl > 100 ist.

Mein unbedarfter Versuch

Code: Alles auswählen

> df$nein_kommt_vor <- ave(df$nein, df$buchstabe, FUN=function(x) if(any(x==1)&(df$zahl>100)) "1" else "3")
bringt nicht das richtige Ergebnis :)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: gruppierte Variable

Beitrag von jogo »

ave() funktioniert hierfür nicht. So wie tapply() kann es nur einen Vektor verarbeiten.
Wenn Du dies mit base R lösen willst, benötigst Du by() oder das Deamteam split() + lapply().

Für data.table sieht das so aus:

Code: Alles auswählen

library("data.table")

df <- structure(list(
  buchstabe = c("a", "b", "b", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "p", "b", "d", "d", "d", "d", "q", "q"), 
  zahl = c(14, 15, 71, 13, 345, 534, 346, 362, 24, 4, NA, 7, 4, 2, 14, 345, 345, 456, 65, 13, 13, 13, 13, 13, 13), 
  essen = c("qq", "ww", "ff", "aa", "vv", "jj", "kk", "ii", "ww", "mm", "nn", "bb", "vv", "cc", "xx", "oo", "jj", "hh", "gg", "aa", "rr", "tt", "zz", "uu", "ii"), 
  nein = c(3, 1, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 1, 3)), row.names = c(NA, 25L), class = "data.frame")
###
setDT(df)
df[, nein_kommt_vor:= any(nein==3 & zahl>100), by=buchstabe]
split(df, df$buchstabe)
Bitte schau mal, ob das passt.

Gruß, Jörg
Antworten