Kapitel 51 Unterschiedliche Methoden Beschriftung der Werte
Es gibt verschiedene Möglichkeiten, wie man diese Daten am besten beschriftet (labelled). Wenn wir nur mit R arbeiten (d.h. speichern der Daten als .rda oder rdata), können wir die Variable direkt als Factor erstellen mit den levels und labels (siehe im nächsten Code-Chunk):
set.seed(123)
<-sample(c(
Likert_Item_mit_neutraler_Mitte_15,
4,
3,
2,
1), size=200, replace=TRUE, prob=c(0.1,0.2,0.25,0.15,0.1))
::freq(Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## Likert_Item_mit_neutraler_Mitte_1
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 20 10.00 10.00 10.00 10.00
## 2 40 20.00 30.00 20.00 30.00
## 3 58 29.00 59.00 29.00 59.00
## 4 55 27.50 86.50 27.50 86.50
## 5 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
<-factor(Likert_Item_mit_neutraler_Mitte_1, levels=c(1,2,3,4,5),
Likert_Item_mit_neutraler_Mitte_1labels=c("Sehr unzufrieden",
"Etwas unzufrieden",
"Weder zufrieden noch unzufrieden",
"Etwas zufrieden",
"Sehr zufrieden" ))
::freq(Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## Likert_Item_mit_neutraler_Mitte_1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## Etwas zufrieden 55 27.50 86.50 27.50 86.50
## Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Wenn wir dies nun als R Daten speichern (.rda), wird die Reihenfolge der Levels im Faktor gleich bleiben.
<-data.frame(id=1:200,Likert_Item_mit_neutraler_Mitte_1)
df::export(df, "R_Daten.Rdata")
rio<-rio::import("R_Daten.Rdata")
df::freq(df$Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte_1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## Etwas zufrieden 55 27.50 86.50 27.50 86.50
## Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Falls wir jedoch diese Datein in einem anderen Format speichern, wie zum Beispiel in einem csv, so verliereen wir Informationen. Zum Beweis speichern wir diese Daten als csv und laden sie wieder. Wir sehen in der Tabelle, dass jetzt die Reihenfolge nicht mehr gleich ist, da R nun die Daten einfach als character Variable behandelt und alphabetisch ordnet. Wir müssten die Variable jetzt wieder neu ordnen, was ziemlich mühsam ist.
::freq(df$Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte_1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## Etwas zufrieden 55 27.50 86.50 27.50 86.50
## Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
::export(df, "csv_Daten.csv")
rio<-rio::import("csv_Daten.csv", sep=",")
df::freq(df$Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte_1
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Etwas unzufrieden 40 20.00 20.00 20.00 20.00
## Etwas zufrieden 55 27.50 47.50 27.50 47.50
## Sehr unzufrieden 20 10.00 57.50 10.00 57.50
## Sehr zufrieden 27 13.50 71.00 13.50 71.00
## Weder zufrieden noch unzufrieden 58 29.00 100.00 29.00 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
$Likert_Item_mit_neutraler_Mitte_1<-factor(df$Likert_Item_mit_neutraler_Mitte_1, levels=c("Sehr unzufrieden","Etwas unzufrieden", "Weder zufrieden noch unzufrieden","Etwas zufrieden", "Sehr zufrieden"))
df::freq(df$Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte_1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## Etwas zufrieden 55 27.50 86.50 27.50 86.50
## Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Achtung: schreibt man den Befehl falsch, indem man anstatt levels labels schreibt, kann man die Daten zerstören und einen schwerwiegenden Fehler einfügen (Jetzt wurden die Labels einfach umgeschrieben und die Zahlen stimmen natürlich nicht mehr):
<-rio::import("csv_Daten.csv", sep=",")
df$falsch_Likert_Item_mit_neutraler_Mitte_1<-factor(df$Likert_Item_mit_neutraler_Mitte_1, labels=c("Sehr unzufrieden","Etwas unzufrieden", "Weder zufrieden noch unzufrieden","Etwas zufrieden", "Sehr zufrieden"))
df
::freq(df$falsch_Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## df$falsch_Likert_Item_mit_neutraler_Mitte_1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 40 20.00 20.00 20.00 20.00
## Etwas unzufrieden 55 27.50 47.50 27.50 47.50
## Weder zufrieden noch unzufrieden 20 10.00 57.50 10.00 57.50
## Etwas zufrieden 27 13.50 71.00 13.50 71.00
## Sehr zufrieden 58 29.00 100.00 29.00 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Das gleiche mit dem Stata Datenformat: Für Stata darf man allerdings nur Variablennamen mit 32 Zeichen haben, deswegen müssen wir die Variable etwas kürzen. Hier sehen wir, dass die Information der Labels komplett verloren geht, die Labels sind jetzt nur noch Nummern (wie wir die Variabel eigentlich ursprünglich erstellt haben).
<-data.frame(id=1:200,Likert_Item_mit_neutraler_Mitte_1)
df
names(df)[2]<-"Likert_Item_mit_neutraler_Mitte1"
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## Etwas zufrieden 55 27.50 86.50 27.50 86.50
## Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
::export(df, "Stata_Daten.dta")
rio<-rio::import("Stata_Daten.dta")
dfstr(df)
## 'data.frame': 200 obs. of 2 variables:
## $ id : num 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.stata")= chr "%12.0g"
## $ Likert_Item_mit_neutraler_Mitte1: num 3 1 4 5 5 3 4 5 4 4 ...
## ..- attr(*, "format.stata")= chr "%10.0g"
## ..- attr(*, "labels")= Named num [1:5] 1 2 3 4 5
## .. ..- attr(*, "names")= chr [1:5] "Sehr unzufrieden" "Etwas unzufrieden" "Weder zufrieden noch unzufrieden" "Etwas zufrieden" ...
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 20 10.00 10.00 10.00 10.00
## 2 40 20.00 30.00 20.00 30.00
## 3 58 29.00 59.00 29.00 59.00
## 4 55 27.50 86.50 27.50 86.50
## 5 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
$Likert_Item_mit_neutraler_Mitte1<-factor(df$Likert_Item_mit_neutraler_Mitte1, levels=c("Sehr unzufrieden","Etwas unzufrieden", "Weder zufrieden noch unzufrieden","Etwas zufrieden", "Sehr zufrieden"))
df::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## -------------------------------------- ------ --------- -------------- --------- --------------
## Sehr unzufrieden 0 0.00 0.00
## Etwas unzufrieden 0 0.00 0.00
## Weder zufrieden noch unzufrieden 0 0.00 0.00
## Etwas zufrieden 0 0.00 0.00
## Sehr zufrieden 0 0.00 0.00
## <NA> 200 100.00 100.00
## Total 200 0.00 100.00 100.00 100.00
Um dieses Problem zu umgehen, könnten wir die Variablen auch wie folgt erstellen:
set.seed(123)
<-sample(c(
Likert_Item_mit_neutraler_Mitte_1"5_Sehr zufrieden",
"4_Etwas zufrieden",
"3_Weder zufrieden noch unzufrieden",
"2_Etwas unzufrieden",
"1_Sehr unzufrieden"), size=200, replace=TRUE, prob=c(0.1,0.2,0.25,0.15,0.1))
Und jetzt wieder, als Test, als Stata Daten exportieren und wieder zurück importieren: Wenn wir die Variable so erstellt haben wie im obigen Code-Chunk, werden die Daten einfach als character (String) exportiert.
<-data.frame(id=1:200,Likert_Item_mit_neutraler_Mitte_1)
dfstr(df)
## 'data.frame': 200 obs. of 2 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Likert_Item_mit_neutraler_Mitte_1: chr "3_Weder zufrieden noch unzufrieden" "1_Sehr unzufrieden" "4_Etwas zufrieden" "5_Sehr zufrieden" ...
names(df)[2]<-"Likert_Item_mit_neutraler_Mitte1"
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
## 1_Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## 2_Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## 3_Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## 4_Etwas zufrieden 55 27.50 86.50 27.50 86.50
## 5_Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
## 1_Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## 2_Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## 3_Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## 4_Etwas zufrieden 55 27.50 86.50 27.50 86.50
## 5_Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
::export(df, "Stata_Daten.dta")
rio<-rio::import("Stata_Daten.dta")
dfstr(df)
## 'data.frame': 200 obs. of 2 variables:
## $ id : num 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.stata")= chr "%12.0g"
## $ Likert_Item_mit_neutraler_Mitte1: chr "3_Weder zufrieden noch unzufrieden" "1_Sehr unzufrieden" "4_Etwas zufrieden" "5_Sehr zufrieden" ...
## ..- attr(*, "format.stata")= chr "%-9s"
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
## 1_Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## 2_Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## 3_Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## 4_Etwas zufrieden 55 27.50 86.50 27.50 86.50
## 5_Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Dies funktioniert nur, wenn wir die Variable vor dem exportieren nicht als Factor formatiert haben. Wenn wir die Variable zuvor als Faktor speichern, wird es nicht gehen.
Was läuft da schief? Wir haben die Variable im vorletzten Code-Chunk zur Factor Variable geändert. Eine Factor Variable hat im Hintergrund die Nummern 1 bis n (aufsteigende Zahl für jedes Level). Die Labels sind immer noch da, das sehen wir mit dem str(df) Befehl, aber wir müssen R explizit anweisen, diese zu nutzen. Das ist etwas komplex, mehr Infos hier (hier klicken) Bei mir funktioniert es nicht - verstehe jedoch noch nicht warum. Working on it.
set.seed(123)
<-sample(c(
Likert_Item_mit_neutraler_Mitte1"5_Sehr zufrieden",
"4_Etwas zufrieden",
"3_Weder zufrieden noch unzufrieden",
"2_Etwas unzufrieden",
"1_Sehr unzufrieden"), size=200, replace=TRUE, prob=c(0.1,0.2,0.25,0.15,0.1))
<-factor(Likert_Item_mit_neutraler_Mitte1, levels=c("1_Sehr unzufrieden","2_Etwas unzufrieden", "3_Weder zufrieden noch unzufrieden","4_Etwas zufrieden","5_Sehr zufrieden"),
Likert_Item_mit_neutraler_Mitte1labels=c("Sehr unzufrieden","Etwas unzufrieden", "Weder zufrieden noch unzufrieden", "Etwas zufrieden","Sehr zufrieden" ))
<-haven::labelled(Likert_Item_mit_neutraler_Mitte1)
Likert_Item_mit_neutraler_Mitte1<-data.frame(id=1:200,Likert_Item_mit_neutraler_Mitte1)
dfstr(df$Likert_Item_mit_neutraler_Mitte1)
## int+lbl [1:200] 3, 1, 4, 5, 5, 3, 4, 5, 4, 4, 5, 4, 2, 2, 3, 5, 3, 3, 4, 5...
labels(df$Likert_Item_mit_neutraler_Mitte1)
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12"
## [13] "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24"
## [25] "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36"
## [37] "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48"
## [49] "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60"
## [61] "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72"
## [73] "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
## [85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96"
## [97] "97" "98" "99" "100" "101" "102" "103" "104" "105" "106" "107" "108"
## [109] "109" "110" "111" "112" "113" "114" "115" "116" "117" "118" "119" "120"
## [121] "121" "122" "123" "124" "125" "126" "127" "128" "129" "130" "131" "132"
## [133] "133" "134" "135" "136" "137" "138" "139" "140" "141" "142" "143" "144"
## [145] "145" "146" "147" "148" "149" "150" "151" "152" "153" "154" "155" "156"
## [157] "157" "158" "159" "160" "161" "162" "163" "164" "165" "166" "167" "168"
## [169] "169" "170" "171" "172" "173" "174" "175" "176" "177" "178" "179" "180"
## [181] "181" "182" "183" "184" "185" "186" "187" "188" "189" "190" "191" "192"
## [193] "193" "194" "195" "196" "197" "198" "199" "200"
levels(df$Likert_Item_mit_neutraler_Mitte1)
## NULL
<-haven::as_factor(df)
df::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 20 10.00 10.00 10.00 10.00
## 2 40 20.00 30.00 20.00 30.00
## 3 58 29.00 59.00 29.00 59.00
## 4 55 27.50 86.50 27.50 86.50
## 5 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
::export(df, "Stata_Daten.dta")
rio<-(rio::import("Stata_Daten.dta"))
dfstr(df)
## 'data.frame': 200 obs. of 2 variables:
## $ id : num 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.stata")= chr "%12.0g"
## $ Likert_Item_mit_neutraler_Mitte1: num 3 1 4 5 5 3 4 5 4 4 ...
## ..- attr(*, "format.stata")= chr "%10.0g"
## ..- attr(*, "labels")= Named num [1:5] 1 2 3 4 5
## .. ..- attr(*, "names")= chr [1:5] "1" "2" "3" "4" ...
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 20 10.00 10.00 10.00 10.00
## 2 40 20.00 30.00 20.00 30.00
## 3 58 29.00 59.00 29.00 59.00
## 4 55 27.50 86.50 27.50 86.50
## 5 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Dies funktioniert schon mal nicht siehe
<-(haven::read_dta("Stata_Daten.dta"))
df$Likert_Item_mit_neutraler_Mitte1<-haven::labelled(df$Likert_Item_mit_neutraler_Mitte1)
df$Likert_Item_mit_neutraler_Mitte1<-as.factor(df$Likert_Item_mit_neutraler_Mitte1)
dflevels(df$Likert_Item_mit_neutraler_Mitte1)
## [1] "1" "2" "3" "4" "5"
names(attr(df, "names"))
## NULL
str(df)
## tibble [200 × 2] (S3: tbl_df/tbl/data.frame)
## $ id : num [1:200] 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.stata")= chr "%12.0g"
## $ Likert_Item_mit_neutraler_Mitte1: Factor w/ 5 levels "1","2","3","4",..: 3 1 4 5 5 3 4 5 4 4 ...
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 20 10.00 10.00 10.00 10.00
## 2 40 20.00 30.00 20.00 30.00
## 3 58 29.00 59.00 29.00 59.00
## 4 55 27.50 86.50 27.50 86.50
## 5 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Irgendwie lädt rio::import die labels nicht korrekt. Ich muss zuerst noch verstehen warum. Weil im Stata .dta File sind die Labels drin. Auch nach dem importieren ist die Information auch noch drin, das sieht man mit dem obigen str(df) Befehl.
names(attr(df$Likert_Item_mit_neutraler_Mitte1, "values"))
## NULL
::val_labels(df$Likert_Item_mit_neutraler_Mitte1) labelled
## NULL
::freq(df$Likert_Item_mit_neutraler_Mitte1) summarytools
## Frequencies
## df$Likert_Item_mit_neutraler_Mitte1
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 20 10.00 10.00 10.00 10.00
## 2 40 20.00 30.00 20.00 30.00
## 3 58 29.00 59.00 29.00 59.00
## 4 55 27.50 86.50 27.50 86.50
## 5 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
attr(df$Likert_Item_mit_neutraler_Mitte1, "names")
## NULL