Seite 1 von 1

gruppierte Variable

Verfasst: Do Mai 28, 2020 9:48 am
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

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 10:40 am
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?

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 12:04 pm
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.

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 1:15 pm
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

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 1:53 pm
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..

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 2:07 pm
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

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 2:25 pm
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

Re: gruppierte Variable

Verfasst: Do Mai 28, 2020 2:37 pm
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

Re: gruppierte Variable

Verfasst: Fr Mai 29, 2020 3:14 pm
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 :)

Re: gruppierte Variable

Verfasst: Fr Mai 29, 2020 7:44 pm
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