Daten importieren
RStudio Projekt
Nun wollen wir die Datensätze aus dem Verhaltensexperiment von der letzten Sitzung in R importieren.
Laden Sie das RStudio Projekt und öffnen Sie es. Im Projekt ist ein R Script File enthalten (import-data.R
).
Einen Datensatz bearbeiten
Es gibt zwei Unterordner: testdata
und data
. In ersterem befindet sich ein Datensatz einer Testperson, in letzterem befinden sich mehrere Datensätze. Wir importieren und bearbeiten zuerst den Datensatz aus dem testdata
Ordner, und wenden anschliessend das Gelernte gleichzeitig auf mehrere Datensätze an.
CSV File importieren
testdata <- read_csv("testdata/ZZ_rdk-discrimination_2022_Mar_07_1403.csv")
Variablen überprüfen
glimpse(testdata)
Rows: 167
Columns: 39
$ cue <chr> "none", "left", "right", "l…
$ direction <chr> "right", "right", "right", …
$ practice_block_loop.thisRepN <dbl> 0, 0, 0, 0, 0, 0, NA, NA, N…
$ practice_block_loop.thisTrialN <dbl> 0, 1, 2, 3, 4, 5, NA, NA, N…
$ practice_block_loop.thisN <dbl> 0, 1, 2, 3, 4, 5, NA, NA, N…
$ practice_block_loop.thisIndex <dbl> 5, 2, 1, 0, 4, 3, NA, NA, N…
$ main_blocks_loop.thisRepN <dbl> NA, NA, NA, NA, NA, NA, NA,…
$ main_blocks_loop.thisTrialN <dbl> NA, NA, NA, NA, NA, NA, NA,…
$ main_blocks_loop.thisN <dbl> NA, NA, NA, NA, NA, NA, NA,…
$ main_blocks_loop.thisIndex <dbl> NA, NA, NA, NA, NA, NA, NA,…
$ static_isi.started <dbl> 0.01033428, 0.03202713, 0.0…
$ static_isi.stopped <dbl> 2.010334, 2.032027, 2.03217…
$ fixation_pre.started <dbl> 26.79425, 36.16522, 44.7852…
$ fixation_pre.stopped <chr> "None", "None", "None", "No…
$ image.started <dbl> 27.19849, 36.28205, 46.0032…
$ image.stopped <chr> "None", "None", "None", "No…
$ fixation_post.started <dbl> 28.17814, 37.28240, 47.0037…
$ fixation_post.stopped <chr> "None", "None", "None", "No…
$ dots_background.started <dbl> 32.18642, 41.30145, 52.0107…
$ dots_background.stopped <chr> "None", "None", "None", "No…
$ dots_stimulus.started <dbl> 32.18642, 41.30145, 52.0107…
$ dots_stimulus.stopped <chr> "None", "None", "None", "No…
$ dots_keyboard_response.keys <chr> "None", "f", "j", "f", "Non…
$ dots_keyboard_response.started <dbl> 32.18642, 41.30145, 52.0107…
$ dots_keyboard_response.stopped <chr> "None", "None", "None", "No…
$ feedback_text.started <dbl> 33.70200, 42.28899, 52.9229…
$ feedback_text.stopped <chr> "None", "None", "None", "No…
$ dots_keyboard_response.rt <dbl> NA, 0.9339199, 0.8488816, 0…
$ instruction_main_text.started <dbl> NA, NA, NA, NA, NA, NA, 81.…
$ instruction_main_text.stopped <chr> NA, NA, NA, NA, NA, NA, "No…
$ instruction_main_keyboard_response.keys <chr> NA, NA, NA, NA, NA, NA, "sp…
$ instruction_main_keyboard_response.rt <dbl> NA, NA, NA, NA, NA, NA, 3.1…
$ instruction_main_keyboard_response.started <dbl> NA, NA, NA, NA, NA, NA, 81.…
$ instruction_main_keyboard_response.stopped <chr> NA, NA, NA, NA, NA, NA, "No…
$ Pseudonym <chr> "ZZ", "ZZ", "ZZ", "ZZ", "ZZ…
$ date <chr> "2022_Mar_07_1403", "2022_M…
$ expName <chr> "rdk-discrimination", "rdk-…
$ psychopyVersion <chr> "03.02.21", "03.02.21", "03…
$ frameRate <dbl> 59.9, 59.9, 59.9, 59.9, 59.…
Practice Trials löschen
library(kableExtra)
testdata |>
slice_head(n = 12) |>
kbl() |>
kable_paper("striped", full_width = FALSE) |>
column_spec(2:7, bold = TRUE) |>
row_spec(1:6, bold = TRUE, color = "white", background = "#D7261E")
cue | direction | practice_block_loop.thisRepN | practice_block_loop.thisTrialN | practice_block_loop.thisN | practice_block_loop.thisIndex | main_blocks_loop.thisRepN | main_blocks_loop.thisTrialN | main_blocks_loop.thisN | main_blocks_loop.thisIndex | static_isi.started | static_isi.stopped | fixation_pre.started | fixation_pre.stopped | image.started | image.stopped | fixation_post.started | fixation_post.stopped | dots_background.started | dots_background.stopped | dots_stimulus.started | dots_stimulus.stopped | dots_keyboard_response.keys | dots_keyboard_response.started | dots_keyboard_response.stopped | feedback_text.started | feedback_text.stopped | dots_keyboard_response.rt | instruction_main_text.started | instruction_main_text.stopped | instruction_main_keyboard_response.keys | instruction_main_keyboard_response.rt | instruction_main_keyboard_response.started | instruction_main_keyboard_response.stopped | Pseudonym | date | expName | psychopyVersion | frameRate |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
none | right | 0 | 0 | 0 | 5 | NA | NA | NA | NA | 0.0103343 | 2.010334 | 26.79425 | None | 27.19849 | None | 28.17814 | None | 32.18642 | None | 32.18642 | None | None | 32.18642 | None | 33.70200 | None | NA | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
left | right | 0 | 1 | 1 | 2 | NA | NA | NA | NA | 0.0320271 | 2.032027 | 36.16522 | None | 36.28205 | None | 37.28240 | None | 41.30145 | None | 41.30145 | None | f | 41.30145 | None | 42.28899 | None | 0.9339199 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
right | right | 0 | 2 | 2 | 1 | NA | NA | NA | NA | 0.0321732 | 2.032173 | 44.78521 | None | 46.00329 | None | 47.00374 | None | 52.01072 | None | 52.01072 | None | j | 52.01072 | None | 52.92295 | None | 0.8488816 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
left | left | 0 | 3 | 3 | 0 | NA | NA | NA | NA | 0.0321533 | 2.032153 | 55.39138 | None | 56.19407 | None | 57.22527 | None | 61.23181 | None | 61.23181 | None | f | 61.23181 | None | 62.21611 | None | 0.9396018 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
none | left | 0 | 4 | 4 | 4 | NA | NA | NA | NA | 0.0321391 | 2.032139 | 64.71204 | None | 64.81315 | None | 65.84603 | None | 69.25240 | None | 69.25240 | None | None | 69.25240 | None | 70.78541 | None | NA | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
right | left | 0 | 5 | 5 | 3 | NA | NA | NA | NA | 0.0323178 | 2.032318 | 73.24960 | None | 74.45209 | None | 75.48391 | None | 79.99045 | None | 79.99045 | None | f | 79.99045 | None | 80.80311 | None | 0.7490084 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | 81.30346 | None | space | 3.187924 | 81.30346 | None | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
right | right | NA | NA | NA | NA | 0 | 0 | 0 | 18 | 0.0160001 | 2.016000 | 86.52245 | None | 86.89231 | None | 87.92302 | None | 92.92987 | None | 92.92987 | None | j | 92.92987 | None | 93.70924 | None | 0.7136441 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
right | right | NA | NA | NA | NA | 0 | 1 | 1 | 31 | 0.0318162 | 2.031816 | 96.17699 | None | 96.54602 | None | 97.57770 | None | 101.58423 | None | 101.58423 | None | j | 101.58423 | None | 102.26673 | None | 0.6271285 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
none | right | NA | NA | NA | NA | 0 | 2 | 2 | 66 | 0.0321148 | 2.032115 | 104.76463 | None | 105.13302 | None | 106.16508 | None | 110.67183 | None | 110.67183 | None | f | 110.67183 | None | 111.38828 | None | 0.6703410 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
none | right | NA | NA | NA | NA | 0 | 3 | 3 | 75 | 0.0321121 | 2.032112 | 113.88535 | None | 115.08794 | None | 116.11989 | None | 119.52612 | None | 119.52612 | None | j | 119.52612 | None | 120.15512 | None | 0.5738488 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
left | left | NA | NA | NA | NA | 0 | 4 | 4 | 13 | 0.0321118 | 2.032112 | 122.62295 | None | 123.82583 | None | 124.85742 | None | 129.36397 | None | 129.36397 | None | j | 129.36397 | None | 130.25975 | None | 0.8405913 | NA | NA | NA | NA | NA | NA | ZZ | 2022_Mar_07_1403 | rdk-discrimination | 03.02.21 | 59.9 |
testdata |>
slice_head(n = 12) |>
select(starts_with("main_block")) |>
kbl() |>
kable_paper("striped", full_width = FALSE) |>
row_spec(1:7, bold = TRUE, color = "white", background = "#D7261E")
main_blocks_loop.thisRepN | main_blocks_loop.thisTrialN | main_blocks_loop.thisN | main_blocks_loop.thisIndex |
---|---|---|---|
NA | NA | NA | NA |
NA | NA | NA | NA |
NA | NA | NA | NA |
NA | NA | NA | NA |
NA | NA | NA | NA |
NA | NA | NA | NA |
NA | NA | NA | NA |
0 | 0 | 0 | 18 |
0 | 1 | 1 | 31 |
0 | 2 | 2 | 66 |
0 | 3 | 3 | 75 |
0 | 4 | 4 | 13 |
Die Variable main_blocks_loop.thisN
ist die Trialnummer. Diese können wir verwenden, um die Zeilen auszuschliessen, die nicht zum Main Block gehören.
# A tibble: 160 × 35
cue direction main_blocks_loop.thisRepN main_blocks_loop.… main_blocks_loo…
<chr> <chr> <dbl> <dbl> <dbl>
1 right right 0 0 0
2 right right 0 1 1
3 none right 0 2 2
4 none right 0 3 3
5 left left 0 4 4
6 none right 0 5 5
7 none left 0 6 6
8 left left 0 7 7
9 left right 0 8 8
10 none right 0 9 9
# … with 150 more rows, and 30 more variables:
# main_blocks_loop.thisIndex <dbl>, static_isi.started <dbl>,
# static_isi.stopped <dbl>, fixation_pre.started <dbl>,
# fixation_pre.stopped <chr>, image.started <dbl>, image.stopped <chr>,
# fixation_post.started <dbl>, fixation_post.stopped <chr>,
# dots_background.started <dbl>, dots_background.stopped <chr>,
# dots_stimulus.started <dbl>, dots_stimulus.stopped <chr>, …
Variablen auswählen
testdata |>
select(-contains("static"),
-contains("fixation"),
-contains("image"),
-contains("instruction"),
-contains("feedback"))
# A tibble: 167 × 23
cue direction practice_block_loop.thisRe… practice_block_… practice_block_…
<chr> <chr> <dbl> <dbl> <dbl>
1 none right 0 0 0
2 left right 0 1 1
3 right right 0 2 2
4 left left 0 3 3
5 none left 0 4 4
6 right left 0 5 5
7 <NA> <NA> NA NA NA
8 right right NA NA NA
9 right right NA NA NA
10 none right NA NA NA
# … with 157 more rows, and 18 more variables:
# practice_block_loop.thisIndex <dbl>, main_blocks_loop.thisRepN <dbl>,
# main_blocks_loop.thisTrialN <dbl>, main_blocks_loop.thisN <dbl>,
# main_blocks_loop.thisIndex <dbl>, dots_background.started <dbl>,
# dots_background.stopped <chr>, dots_stimulus.started <dbl>,
# dots_stimulus.stopped <chr>, dots_keyboard_response.keys <chr>,
# dots_keyboard_response.started <dbl>, …
testdata
# A tibble: 167 × 23
cue direction practice_block_loop.thisRe… practice_block_… practice_block_…
<chr> <chr> <dbl> <dbl> <dbl>
1 none right 0 0 0
2 left right 0 1 1
3 right right 0 2 2
4 left left 0 3 3
5 none left 0 4 4
6 right left 0 5 5
7 <NA> <NA> NA NA NA
8 right right NA NA NA
9 right right NA NA NA
10 none right NA NA NA
# … with 157 more rows, and 18 more variables:
# practice_block_loop.thisIndex <dbl>, main_blocks_loop.thisRepN <dbl>,
# main_blocks_loop.thisTrialN <dbl>, main_blocks_loop.thisN <dbl>,
# main_blocks_loop.thisIndex <dbl>, dots_background.started <dbl>,
# dots_background.stopped <chr>, dots_stimulus.started <dbl>,
# dots_stimulus.stopped <chr>, dots_keyboard_response.keys <chr>,
# dots_keyboard_response.started <dbl>, …
Variablen umbennen
testdata <- testdata |>
select(trial = main_blocks_loop.thisN,
ID = Pseudonym,
cue,
direction,
response = dots_keyboard_response.keys,
rt = dots_keyboard_response.rt)
testdata
# A tibble: 167 × 6
trial ID cue direction response rt
<dbl> <chr> <chr> <chr> <chr> <dbl>
1 NA ZZ none right None NA
2 NA ZZ left right f 0.934
3 NA ZZ right right j 0.849
4 NA ZZ left left f 0.940
5 NA ZZ none left None NA
6 NA ZZ right left f 0.749
7 NA ZZ <NA> <NA> <NA> NA
8 0 ZZ right right j 0.714
9 1 ZZ right right j 0.627
10 2 ZZ none right f 0.670
# … with 157 more rows
Neue Variablen definieren
Alternative:
testdata <- testdata |>
mutate(choice = if_else(response == "j", "right", "left"),
response = as.numeric(choice == "right"))
Wir erstellen ausserdem hier eine Variable, welche angibt, ob der Cue valid
, invalid
oder neutral
war. Ein Cue ist genau dann valide, wenn er dieselbe Richtung hat wie der RDK Stimulus, d.h. cue == direction
.
testdata <- testdata |>
mutate(correct = as.numeric(choice == direction))
Gruppierungsvariablen
glimpse(testdata)
Rows: 167
Columns: 9
$ trial <dbl> NA, NA, NA, NA, NA, NA, NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10…
$ ID <chr> "ZZ", "ZZ", "ZZ", "ZZ", "ZZ", "ZZ", "ZZ", "ZZ", "ZZ", "ZZ", …
$ cue <chr> "none", "left", "right", "left", "none", "right", NA, "right…
$ direction <chr> "right", "right", "right", "left", "left", "left", NA, "righ…
$ response <dbl> 0, 0, 1, 0, 0, 0, NA, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0,…
$ rt <dbl> NA, 0.9339199, 0.8488816, 0.9396018, NA, 0.7490084, NA, 0.71…
$ choice <chr> "left", "left", "right", "left", "left", "left", NA, "right"…
$ condition <chr> "neutral", "invalid", "valid", "valid", "neutral", "invalid"…
$ correct <dbl> 0, 0, 1, 1, 1, 1, NA, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1,…
testdata <- testdata |>
mutate_if(is.character, as.factor)
glimpse(testdata)
Rows: 167
Columns: 9
$ trial <dbl> NA, NA, NA, NA, NA, NA, NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10…
$ ID <fct> ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, ZZ, …
$ cue <fct> none, left, right, left, none, right, NA, right, right, none…
$ direction <fct> right, right, right, left, left, left, NA, right, right, rig…
$ response <dbl> 0, 0, 1, 0, 0, 0, NA, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0,…
$ rt <dbl> NA, 0.9339199, 0.8488816, 0.9396018, NA, 0.7490084, NA, 0.71…
$ choice <fct> left, left, right, left, left, left, NA, right, right, left,…
$ condition <fct> neutral, invalid, valid, valid, neutral, invalid, NA, valid,…
$ correct <dbl> 0, 0, 1, 1, 1, 1, NA, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1,…
Accuracy pro Bedingung
Wir können nun die accuracy in jeder Cue-Bedingung berechnen. Es gibt hier zwei Möglichkeiten: wir berechen die Anzahl Trials (N
), und die Anzahl korrekter Antworten (ncorrect
) separat. Der Anteil korrekter Antworten ist dann einfach ncorrect/N
. Dasselbe Ergebnis erhalten wir, wenn wir einfach den Mittelwert der korrekten Antworten nehmen.
testaccuracy <- testdata |>
group_by(condition) |>
summarise(N = n(),
ncorrect = sum(correct),
accuracy = ncorrect/N,
accuracy2 = mean(correct))
testaccuracy
# A tibble: 4 × 5
condition N ncorrect accuracy accuracy2
<fct> <int> <dbl> <dbl> <dbl>
1 invalid 18 14 0.778 0.778
2 neutral 82 67 0.817 0.817
3 valid 66 62 0.939 0.939
4 <NA> 1 NA NA NA
Mehrere Datensätze bearbeiten
Nun werden wir dasselbe wie oben machen, aber dieses Mal für alle .csv
Files, die in einem Ordner gespeichert sind.
Funktion definieren
Nun wollen wir die ersten paar Schritte gleichzeitig auf mehrere Files anwenden:
-
CSV
File einlesen - Filename hinzufügen
- Practice Trials löschen
- Practice Variablen löschen
Dieser Vorgang ist in R ziemlich elegant. Anstatt dass wir manuell über alle Files iterieren müssen, können wir eine Funktion definieren, die wir auf ein File anwenden können, und dann wenden wir diese Funktion auf alle Files an.
Die Funktion, welche wir auf ein einzelnes .csv
File anweden möchten, ist diese:
Alle Files in einem Ordner auflisten
datadir <- "data/"
list_of_files <- datadir |>
list.files(pattern = "csv", recursive = TRUE, full.names = TRUE)
list_of_files
[1] "data//JH_rdk-discrimination_2022_Mar_07_1403.csv"
[2] "data//NS_rdk-discrimination_2022_Mar_07_1331.csv"
[3] "data//rh_rdk-discrimination_2022_Mar_02_1105.csv"
[4] "data//sb_rdk-discrimination_2022_Mar_06_0746.csv"
[5] "data//SS91_rdk-discrimination_2022_Mar_06_0953.csv"
[6] "data//VP1_rdk-discrimination_2022_Mar_07_1237.csv"
[7] "data//VP2_rdk-discrimination_2022_Mar_07_1302.csv"
[8] "data//VPN01_rdk-discrimination_2022_Mar_01_2142.csv"
[9] "data//VPN02_rdk-discrimination_2022_Mar_01_2208.csv"
Funktion auf Liste anwenden
data <- list_of_files |>
map_dfr(~ import_function(.x))
Variablen auswählen und umbennen
data <- data |>
select(trial = main_blocks_loop.thisN,
ID = Pseudonym,
cue,
direction,
response = dots_keyboard_response.keys,
rt = dots_keyboard_response.rt)
Neue Variablen definieren
Korrekte Antworten
data <- data |>
mutate(correct = as.numeric(choice == direction))
glimpse(data)
Rows: 1,440
Columns: 8
$ trial <dbl> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
$ ID <chr> "JH", "JH", "JH", "JH", "JH", "JH", "JH", "JH", "JH", "JH", …
$ cue <chr> "right", "right", "none", "none", "left", "none", "none", "l…
$ direction <chr> "right", "right", "right", "right", "left", "right", "left",…
$ response <dbl> 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, …
$ rt <dbl> 0.7136441, 0.6271285, 0.6703410, 0.5738488, 0.8405913, 0.667…
$ choice <chr> "right", "right", "left", "right", "right", "right", "right"…
$ correct <dbl> 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
data |>
slice_head(n = 20)
# A tibble: 20 × 8
trial ID cue direction response rt choice correct
<dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <dbl>
1 0 JH right right 1 0.714 right 1
2 1 JH right right 1 0.627 right 1
3 2 JH none right 0 0.670 left 0
4 3 JH none right 1 0.574 right 1
5 4 JH left left 1 0.841 right 0
6 5 JH none right 1 0.668 right 1
7 6 JH none left 1 1.12 right 0
8 7 JH left left 0 0.640 left 1
9 8 JH left right 0 1.13 left 0
10 9 JH none right 1 1.03 right 1
11 10 JH none left 0 1.35 left 1
12 11 JH left left 0 0.688 left 1
13 12 JH left left 0 0.721 left 1
14 13 JH none left 0 0.655 left 1
15 14 JH right right 1 1.02 right 1
16 15 JH none right 1 1.12 right 1
17 16 JH left left 0 1.08 left 1
18 17 JH right left 0 0.643 left 1
19 18 JH right right 1 0.716 right 1
20 19 JH left left 0 0.578 left 1
Cue-Bedingungsvariable
Daten als CSV speichern
An dieser Stelle speichern wir den neu kreierten Datensatz als .csv
File. Somit können wir die Daten einfach importieren, ohne die ganzen Schritte wiederholen zu müssen.
data |> write_csv(file = "data_clean/rdkdata.csv")
data |>
slice_head(n = 20)
# A tibble: 20 × 9
trial ID cue direction response rt choice correct condition
<dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <dbl> <chr>
1 0 JH right right 1 0.714 right 1 valid
2 1 JH right right 1 0.627 right 1 valid
3 2 JH none right 0 0.670 left 0 neutral
4 3 JH none right 1 0.574 right 1 neutral
5 4 JH left left 1 0.841 right 0 valid
6 5 JH none right 1 0.668 right 1 neutral
7 6 JH none left 1 1.12 right 0 neutral
8 7 JH left left 0 0.640 left 1 valid
9 8 JH left right 0 1.13 left 0 invalid
10 9 JH none right 1 1.03 right 1 neutral
11 10 JH none left 0 1.35 left 1 neutral
12 11 JH left left 0 0.688 left 1 valid
13 12 JH left left 0 0.721 left 1 valid
14 13 JH none left 0 0.655 left 1 neutral
15 14 JH right right 1 1.02 right 1 valid
16 15 JH none right 1 1.12 right 1 neutral
17 16 JH left left 0 1.08 left 1 valid
18 17 JH right left 0 0.643 left 1 invalid
19 18 JH right right 1 0.716 right 1 valid
20 19 JH left left 0 0.578 left 1 valid
Gruppierungsvariablen
data <- data |>
mutate_if(is.character, as.factor)
glimpse(data)
Rows: 1,440
Columns: 9
$ trial <dbl> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
$ ID <fct> JH, JH, JH, JH, JH, JH, JH, JH, JH, JH, JH, JH, JH, JH, JH, …
$ cue <fct> right, right, none, none, left, none, none, left, left, none…
$ direction <fct> right, right, right, right, left, right, left, left, right, …
$ response <dbl> 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, …
$ rt <dbl> 0.7136441, 0.6271285, 0.6703410, 0.5738488, 0.8405913, 0.667…
$ choice <fct> right, right, left, right, right, right, right, left, left, …
$ correct <dbl> 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ condition <fct> valid, valid, neutral, neutral, valid, neutral, neutral, val…
Accuracy pro Person/Bedingung
Accuracy pro Person und pro Bedingung berechnen.
accuracy <- data |>
group_by(ID, condition) |>
summarise(N = n(),
ncorrect = sum(correct),
accuracy = mean(correct))
`summarise()` has grouped output by 'ID'. You can override using the `.groups`
argument.
accuracy
# A tibble: 27 × 5
# Groups: ID [9]
ID condition N ncorrect accuracy
<fct> <fct> <int> <dbl> <dbl>
1 JH invalid 16 13 0.812
2 JH neutral 80 66 0.825
3 JH valid 64 60 0.938
4 NS invalid 16 11 0.688
5 NS neutral 80 56 0.7
6 NS valid 64 58 0.906
7 rh invalid 16 2 0.125
8 rh neutral 80 64 0.8
9 rh valid 64 61 0.953
10 sb invalid 16 1 0.0625
# … with 17 more rows
Visualisieren
accuracy |>
ggplot(aes(x = condition, y = accuracy, fill = condition)) +
geom_col() +
scale_fill_manual(
values = c(invalid = "#9E0142",
neutral = "#C4C4B7",
valid = "#2EC762")
) +
labs(
x = "Cue",
y = "Proportion correct",
title = "Accuracy per person/condition"
) +
theme_linedraw(base_size = 28) +
facet_wrap(~ID)
Reuse
Citation
@online{ellis2022,
author = {Andrew Ellis},
title = {Daten Importieren},
date = {2022-03-08},
url = {https://kogpsy.github.io/neuroscicomplabFS22//pages/chapters/02_importing_data.html},
langid = {en}
}