Kodieren mehrerer richtiger Antworten mit if-Schleife

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

Moderatoren: EDi, jogo

Antworten
Zwänni
Beiträge: 1
Registriert: Fr Jul 07, 2023 12:11 pm

Kodieren mehrerer richtiger Antworten mit if-Schleife

Beitrag von Zwänni »

Hallo,
ich möchte gerne eine sequentielle Bepunktung ( 1 = richtig, 0= falsch) von Testitems mit vier Antwortkategorien (1:4) vornehmen und habe dafür bereits dieses hervorragende Tutorial gefunden: https://m-py.github.io/TesttheorieR/sch ... -testitems. Es scheitert allerdings an der Anwendung auf meinen Datensatz, da für einige Items zwei Antworten korrekt sind (in der Variable bt_keys gerade mit | gekennzeichnet, z.b. ist für BT_1 ist die Antwort 3 richtig, für BT_3 sind Antworten 1 und 2 richtig). Wie kann man das umsetzen?

Vielen Dank für die Hilfe

Beispielcode (mit dem | operator funktioniert es NICHT):

Code: Alles auswählen



## Load libraries

library(readxl)
library(openxlsx) 
library(dplyr)
library(knitr)
library(data.table)
library(readr)

## read data
tonegen_clean <- read_xlsx("tonegen_clean.xlsx")

# correct keys for tone generation task

# Pretest

bt_keys <- c(
3,	  3,	 # BT_1, BT_2
1|2,	1|2, # BT_3, BT_4
3|4,	3|4, # BT_5, BT_6
2|4,  2|4, # BT_7, BT_8
3,	  3,   # BT_9, BT_10
1|2,  1|2, # BT_11, BT_12
3|4,	3|4, # BT_13, BT_14
1|2,	1|2, # BT_15, BT_16
2|4,  2|4, # BT_17, BT_18
1, 1, 1)   # BT_19, BT_20, BT_21

# FOR loops for coding correct answers:

  # Pretest
for (i in 1:21) {
    # 1. choose column-name of i-th item:
    colnamebt <- paste0("BT_", i)
    # 2. choose response:
    ith_itembt <- tonegen_clean[[colnamebt]]
    # 3. recode:
    bt_response <- ifelse (ith_itembt == bt_keys[i], 1, 0) 
    # 4. name the new columns:
    new_colnamebt  <- paste0(colnamebt, "_cod")
     # 5. add coded values to data.frame an:
    tonegen_clean[[new_colnamebt]] <- bt_response}
tonegen_clean.xlsx
(61.19 KiB) 32-mal heruntergeladen
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Kodieren mehrerer richtiger Antworten mit if-Schleife

Beitrag von Athomas »

Dieses Skript wurde als Begleitmaterial für eine Lehrveranstaltung konzipiert.
Hmm, hmm, hmm. Hast Du denn an dieser Lehrveranstaltung teilgenommen - oder hast Du Dir das gespart und bist direkt in die Äkschen eingestiegen :lol: ?
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Kodieren mehrerer richtiger Antworten mit if-Schleife

Beitrag von Athomas »

Ich habe etwas gefrickelt, was sich an Deinen Vorstellungen orientiert, allerdings keine „for loops“ enthält, sondern das Ganze eher R-mäßig angeht.

Aus Deiner Beschreibung ist nicht ersichtlich, welche Bedeutung die „a-Variablen“ (etwa „BT_8a“) haben - Du lieferst ja hoffentlich nichts mit, was für Deine Frage bedeutungslos ist!?

Auch habe ich mich an Deinem Ansatz zur Vorgabe der richtigen Antworten orientiert (Stichwort „list column“), das ist aber sicher nicht der einfachste (und natürliche) Weg – der wäre meiner Meinung nach, alle „richtigen“ Kombinationen von Fragen-Nr. und Antwort (untereinander) aufzuzählen und die (ins „lange“ Format gebrachten) erfolgten Antworten damit abzugleichen…

Code: Alles auswählen

library(openxlsx) 
library(data.table)

Antworten <- data.table(read.xlsx("http://forum.r-statistik.de/download/file.php?id=1851"))
Antworten[  , X1:=NULL]

Antworten.long <- melt(Antworten, id="CASE", variable.factor=FALSE)

Testnummer <- function(Text) as.integer(gsub("a", "", gsub("BT_", "", Text)))
Typ        <- function(Text) ifelse(grepl("a", Text), "Zusatz", "Antwort")

Antworten.long[  , ":="(TstNr=Testnummer(variable), TYP=Typ(variable))]
Antworten.long[  , variable:=NULL]

Antworten.semi <- dcast(Antworten.long, CASE + TstNr ~ TYP)
setkey(Antworten.semi, TstNr)
#-------------------------------------------------------------------------------

Richtig <- data.table(richtig=list(3, 3, c(1,2), c(1,2), c(3,4), c(3,4), c(2,4), 
                                   c(2,4), 3, 3, c(1,2), c(1,2), c(3,4), c(3,4), 
                                   c(1,2), c(1,2), c(2,4), c(2,4), 1, 1, 1))
Richtig[  , TstNr:=1:.N]
setkey(Richtig, TstNr)

Auswertung <- Richtig[Antworten.semi]

Auswertung[  , korrekte.Antwort:=mapply(Antwort, richtig, FUN="%in%")]

PunkteProKandidat <- Auswertung[  , .(Summe=sum(korrekte.Antwort)), by=CASE]
max(PunkteProKandidat$Summe)
Antworten