Kreuztabelle und Summenprozent

Alles zum Thema der beschreibenden Statistik

Moderator: jogo

Antworten
rudiment
Beiträge: 4
Registriert: Mi Sep 25, 2019 3:35 pm

Kreuztabelle und Summenprozent

Beitrag von rudiment »

Hallo liebes Forum,

ich bin ein Neueinsteiger in R und auch hier im Forum. Ich hoffe, dass ich keine allzu blöden Fragen stelle... Ich verzweifele gerade ein wenig. Ich schaffe es zwar, Kreuztabellen in der von mir gewünschten Form zu erstellen; leider gelingt mir das damit weiterarbeiten noch nicht. Vielleicht könnt ihr mir aber helfen. Gegeben sei folgender Code:

Code: Alles auswählen

d <- table(
ID <- c("Jonathan", "Jonathan", "Jonathan", "Jonathan", "Annika", "Annika", "Annika", "Annika", "Hans", "Hans", "Hans", "Hans"),
Zeit <- c("T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4"),
Versuch <- c("1", "1", "1", "1", "0", "0", "0", "0", "1", "0", "0", "1"))
Eine "1" bei Versuch bedeutet, dass dieser durchgeführt wurde.
Der Code führt zu folgender Ausgabe:

Code: Alles auswählen

> d

, ,  = 0

          
           T1 T2 T3 T4
  Annika    1  1  1  1
  Hans      0  1  1  0
  Jonathan  0  0  0  0

, ,  = 1

          
           T1 T2 T3 T4
  Annika    0  0  0  0
  Hans      1  0  0  1
  Jonathan  1  1  1  1
Ich würde gerne berechnen,
1) wie viele Prozent der IDs Versuche zu den jeweiligen Zeitpunkten (z.B. T1) gemacht haben, d.h. es sollte eine Zeile geschrieben werden, in der in der entsprechenden Zelle für T1 33,3% steht, für T2 66,6%, für T3 66,6% und für T4 33,3% (relative Randhäufigkeiten).
2) an wie vielen Zeitpunkten die jeweiligen IDs Versuche gemacht haben, d.h. es soll eine zusätzliche Spalte geschrieben werden, in der in den jeweiligen Zellen für Annika 100%, für Hans 50% und für Jonathan 0% geschrieben wird (relative Randhäufigkeiten).

Eine Lösung hierzu hilft mir aber hoffentlich bei meinem Problem an einem wesentlich größeren Datensatz weiter, an dem ich gerade sitze.

Für bin für jeden Tipp sehr dankbar!
Gruß,
rudiment
Benutzeravatar
databraineo
Beiträge: 10
Registriert: Mo Apr 02, 2018 8:20 am

Re: Kreuztabelle und Summenprozent

Beitrag von databraineo »

Hallo rudiment,

also erstmal großes Lob, dass Du direkt ein Beispiel mitgeliefert hast. Damit kann man gut arbeiten. Nur die Bezeichnungen 0 und 1 für die beiden Versuche haben mich erst verwirrt. Dachte zuerst, dass 0 = kein Versuch durchgeführt.

Da fallen mir drei Vorgehensweisen zu ein. Du schreibst ja, dass Du es eigentlich einen größeren Datensatz bearbeiten willst. Musst Du schauen, was für dich passt. Mir gefällt 2b) am besten 8-)

1) der faule Ansatz

Code: Alles auswählen

#Anteil IDs
colSums(d[,,1])/3
colSums(d[,,2])/3

#Anteil Zeiten
rowSums(d[,,1])/4
rowSums(d[,,2])/4))
2a) Längsdatensatz einfach

Code: Alles auswählen

library(dplyr)
#zuerst einen data.frame erstellen inkl. Zählvariable
df <- data.frame(
  ID = c("Jonathan", "Jonathan", "Jonathan", "Jonathan", "Annika", "Annika", "Annika", "Annika", "Hans", "Hans", "Hans", "Hans"),
  Zeit =  c("T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4"),
  Versuch = c("1", "1", "1", "1", "0", "0", "0", "0", "1", "0", "0", "1"),
  durchgefuehrt = 1,
  stringsAsFactors = FALSE)

#Anteil IDs
df %>% group_by(Zeit,Versuch) %>% 
  summarize(AnteilIDs = sum(durchgefuehrt)/4)  
  
#Anteil Zeiten
df %>% group_by(ID,Versuch) %>% 
  summarize(AnteilZeiten = sum(durchgefuehrt)/4)
2b) Längsdatensatz vollständig
bisschen doof bei 2a) ist, dass wir keinen vollständigen Datensatz haben, daher würde ich zuerst die Tabelle vervollständigen

Code: Alles auswählen

library(dplyr)
df <- data.frame(
  ID = c("Jonathan", "Jonathan", "Jonathan", "Jonathan", "Annika", "Annika", "Annika", "Annika", "Hans", "Hans", "Hans", "Hans"),
  Zeit =  c("T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4"),
  Versuch = c("1", "1", "1", "1", "0", "0", "0", "0", "1", "0", "0", "1"),
  durchgefuehrt = 1,
  stringsAsFactors = FALSE)

#vollständigen Datensatz erzeugen
dfFull <- expand.grid(ID=c("Jonathan","Annika","Hans"),
                      Zeit=c("T1","T2","T3","T4"),
                      Versuch=c("0","1"),
                      stringsAsFactors = FALSE)
# verbindet die beiden data.frames (left_join = linker Datensatz bleibt vollständig) und ersetzt dabei fehlende Werte im rechten Datensatz durch 0
dfFull <- left_join(dfFull,df) %>% 
  mutate(durchgefuehrt = coalesce(durchgefuehrt,0))
  
# dann geht es weiter wie in 2a, nur dass wir jetzt n() zum Zählen verwenden können
df %>% group_by(Zeit,Versuch) %>% 
  summarize(AnteilIDs = sum(Dummy)/n())  
df %>% group_by(ID,Versuch) %>% 
  summarize(AnteilZeiten = sum(durchgefuehrt)/n())


3) Querdatensatz
Der Quer-Datensatz ist für die meisten Menschen einfacher zu verstehen, dafür muss man sich um die Spalten einzeln kümmern

Code: Alles auswählen

library(tidyr)
library(dplyr)
df <- data.frame(
  ID = c("Jonathan", "Jonathan", "Jonathan", "Jonathan", "Annika", "Annika", "Annika", "Annika", "Hans", "Hans", "Hans", "Hans"),
  Zeit =  c("T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4"),
  Versuch = c("1", "1", "1", "1", "0", "0", "0", "0", "1", "0", "0", "1"),
  durchgefuehrt = 1,
  stringsAsFactors = FALSE)

# umwandeln in Quer-Datensatz (Achtung, braucht eine neue Version des tidyr-Package)
df2 <- pivot_wider(df, names_from = Versuch, values_from = durchgefuehrt, 
                   values_fill = list(durchgefuehrt=0), names_prefix="Versuch.")

#Anteil IDs
df2 %>% group_by(Zeit) %>% 
  summarize(Anteil.0 = sum(Versuch.0)/n(),
            Anteil.1 = sum(Versuch.1)/n())
 
 #Anteil Zeiten
df2 %>% group_by(ID) %>% 
  summarize(Anteil.0 = sum(Versuch.0)/n(),
            Anteil.1 = sum(Versuch.1)/n())
 
Hoffe, damit konnte ich Dir weiterhelfen. Welche Version passt am besten für Dich?

Viele Grüße,
Holger
Lasst uns helfen, dass Menschen mittels Datenanalyse intelligente Entscheidungen treffen

Website: Databraineo - Data Science Blog
Twitter: @databraineo
Facebook-Gruppe: Data Science Deutschland
rudiment
Beiträge: 4
Registriert: Mi Sep 25, 2019 3:35 pm

Re: Kreuztabelle und Summenprozent

Beitrag von rudiment »

Hallo Holger,

herzlichen Dank für deine rasche und die so ausführliche Rückmeldung! Das ist echt klasse! Den faulen Ansatz und 2a) konnte ich bereits nachvollziehen, für 2b) und 3) brauche ich wohl noch was, da ich meine Daten noch entsprechend einbinden muss. Wie gesagt, ich bin Neuling und deshalb brauche ich ein wenig länger...

An einer Stelle habe ich einen Tippfehler gefunden; bei 2a) müsste es richtig heißen:

Code: Alles auswählen

df %>% group_by(Zeit,Versuch) %>% 
  summarize(AnteilIDs = sum(durchgefuehrt)/3)  
(es stand dort: df %>% group_by(Zeit,Versuch) %>%
summarize(AnteilIDs = sum(durchgefuehrt)/4)

Nochmals vielen Dank, ich werde dann baldmöglichst posten, was mir am besten gefällt :-)

Grüße
rudiment
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Kreuztabelle und Summenprozent

Beitrag von Athomas »

Bist Du Dir sicher, dass Du Deine Daten ordentlich beschrieben hast - und dass die Funktion "table" das macht, was Du möchtest?

Ich habe den Eindruck, dass das Triple (ID, Zeit, Versuch) schon eine Art H-Tabelle ist: 1, wenn die fragliche Person zu dem Zeitpunkt den Versuch durchgeführt hat, Null sonst.

Zusätzlich erzeugst Du durch table() eine "Lage" mit Einsen, wenn die Person den Versuch zu diesem ZP nicht durchgeführt hat - also quasi das Komplement zur anderen Lage!?
rudiment
Beiträge: 4
Registriert: Mi Sep 25, 2019 3:35 pm

Re: Kreuztabelle und Summenprozent

Beitrag von rudiment »

Athomas hat geschrieben: Fr Sep 27, 2019 4:58 pm Bist Du Dir sicher, dass Du Deine Daten ordentlich beschrieben hast - und dass die Funktion "table" das macht, was Du möchtest?

Ich habe den Eindruck, dass das Triple (ID, Zeit, Versuch) schon eine Art H-Tabelle ist: 1, wenn die fragliche Person zu dem Zeitpunkt den Versuch durchgeführt hat, Null sonst.

Zusätzlich erzeugst Du durch table() eine "Lage" mit Einsen, wenn die Person den Versuch zu diesem ZP nicht durchgeführt hat - also quasi das Komplement zur anderen Lage!?
Hmmm, da hat du vollkommen recht :shock: Das ist wohl auch ein wenig der Tatsache geschuldet, dass ich noch r-Anfänger bin und hier meine Originaldaten nicht einbringen kann. Ich mache mich mal auf die Suche nach einer Alternative...
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Kreuztabelle und Summenprozent

Beitrag von Athomas »

Ich mache mich mal auf die Suche nach einer Alternative...
Mein Vorschlag, unter Verwendung von "data.table":

Code: Alles auswählen

library(data.table)
DT <- data.table(ID      = c("Jonathan", "Jonathan", "Jonathan", "Jonathan", "Annika", "Annika", "Annika", "Annika", "Hans", "Hans", "Hans", "Hans"),
                 Zeit    = c("T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4", "T1", "T2", "T3", "T4"),
                 Versuch = c("1", "1", "1", "1", "0", "0", "0", "0", "1", "0", "0", "1"))

DT[  , .(Quote.pro.ZP = sum(Versuch=="1")/.N), by=Zeit]

DT[  , Quote.pro.Person:=sum(Versuch=="1")/.N, by=ID]
Ich will jetzt (wg. Anfänger :) ) nicht daran herummäkeln, dass die verwendeten Typen (character für "Zeit" und "Versuch") wenig passend erscheinen...
rudiment
Beiträge: 4
Registriert: Mi Sep 25, 2019 3:35 pm

Re: Kreuztabelle und Summenprozent

Beitrag von rudiment »

Athomas hat geschrieben: Mo Sep 30, 2019 3:58 pm Ich will jetzt (wg. Anfänger :) ) nicht daran herummäkeln, dass die verwendeten Typen (character für "Zeit" und "Versuch") wenig passend erscheinen...
Super, ganz herzlichen Dank, das passt jetzt :mrgreen: Und in der Tat, die Variablen als character waren jetzt nicht der Weisheit letzter Schluss. Aber ich arbeite daran 8-)
Antworten