Prace dyplomowe · Przygotowanie danych

Dane z Google Forms i LimeSurvey: jak zakodować odpowiedzi do analizy w SPSS i R

Eksport z ankiety internetowej to jeszcze nie zbiór danych. Pokazujemy krok po kroku, jak zamienić odpowiedzi z Formularzy Google i LimeSurvey w plik gotowy do analizy w SPSS i R – z kodem, przykładowymi danymi i wzorem książki kodowej.

Strona główna / Blog / Dane z Google Forms i LimeSurvey
W skrócie: Surowy eksport z Formularzy Google czy LimeSurvey trzeba zamienić w uporządkowany zbiór: krótkie nazwy zmiennych, liczby zamiast słownych odpowiedzi, przekodowane pozycje odwrócone, osobna zmienna 0/1 dla każdej opcji wielokrotnego wyboru i jawne kody braków. Nie poprawiaj danych ręcznie w Excelu – zapisuj każdy krok w skrypcie R lub w składni SPSS. Uważaj na kody alfabetyczne (factor(), automatyczne rekodowanie), które niszczą porządek skali Likerta, i dołącz do pracy książkę kodową.

Dlaczego surowy eksport z ankiety nie nadaje się do analizy?

Ankieta zamknięta, odpowiedzi pobrane – i pierwszy zgrzyt. W nagłówkach są całe pytania, zamiast liczb – słowa („Raczej się zgadzam”), kilka zaznaczonych odpowiedzi siedzi w jednej komórce, a na początku pliku wiszą Twoje próbne wypełnienia. Z takiego pliku program nie policzy ani średniej, ani rzetelności skali. Zanim zaczniesz analizę ankiety, zamień eksport w porządny zbiór danych: jedna osoba w wierszu, jedna zmienna w kolumnie, liczby zamiast tekstu i jasno oznaczone braki.

Poradnik prowadzi przez cały proces w dziewięciu krokach na przykładzie pliku z Formularzy Google (dane symulowane, do pobrania) i pokazuje, czym różni się eksport z LimeSurvey. Każdy krok wykonasz w R (gotowy kod poniżej) albo w SPSS (ścieżki menu w osobnej sekcji). Zasada nadrzędna: nie poprawiaj danych ręcznie w arkuszu – zapisuj każdy krok w skrypcie lub w składni. Ellis i Leek (2018) radzą, by osoba analizująca dane dostawała dane surowe razem z opisem wszystkich kroków wstępnego przetwarzania – tylko wtedy każdą decyzję da się sprawdzić i powtórzyć.

Jak pobrać odpowiedzi z Google Forms i LimeSurvey?

Formularze Google

Odpowiedzi pobierzesz na dwa sposoby (Google, b.d.): przez Arkusz Google – w zakładce Odpowiedzi kliknij Połącz z Arkuszami (ang. Link to Sheets), a potem w arkuszu Plik → Pobierz jako .csv albo .xlsx – albo bezpośrednio: Odpowiedzi → menu ⋮ → Pobierz odpowiedzi (.csv). Pomoc Google zaznacza, że tak pobrane odpowiedzi nie muszą być ułożone według czasu wysłania.

Pierwsza kolumna eksportu to moment wysłania formularza (w polskim arkuszu: Sygnatura czasowa), a nagłówkami pozostałych są pełne treści pytań. Siatka daje osobną kolumnę dla każdego stwierdzenia („Pytanie [stwierdzenie]”), skala liniowa zapisuje się jako liczba, a jednokrotny wybór i siatka – jako tekst etykiety. Pola wyboru trafiają do jednej komórki, rozdzielone przecinkiem i spacją, razem z tekstem z opcji „Inne”.

LimeSurvey

W LimeSurvey odpowiedzi eksportujesz z menu Eksport w części odpowiedzi i statystyk (ang. Responses & statistics → Export) – m.in. do CSV, Excela, SPSS (.sav), Staty i R (LimeSurvey, 2026). Ustaw stan ukończenia (LimeSurvey zapisuje także ankiety przerwane), odpowiedzi jako kody (wartości nadane opcjom w edytorze – najlepiej od początku 1–5) i nagłówki jako kody pytań (np. STR01), które od razu nadają się na nazwy zmiennych.

Najwygodniejszy jest eksport do pliku .sav: otwiera się bezpośrednio w SPSS lub PSPP i ma już etykiety zmiennych i wartości. Eksport do R daje składnię i plik danych, a pytania z zamkniętą listą odpowiedzi stają się czynnikami (factor) z etykietami (LimeSurvey, 2026). Sprawdź jednak kierunek skal – eksport nie wie, które pozycje są odwrócone.

Porównanie eksportu odpowiedzi z Formularzy Google i z LimeSurvey
Cecha eksportuFormularze GoogleLimeSurvey
FormatyCSV, przez Arkusz Google także .xlsxCSV, Excel, SPSS (.sav), R, Stata i inne
Nagłówki kolumnPełna treść pytaniaKod pytania, tekst lub oba
Odpowiedzi zamknięteTekst etykiety (skala liniowa – liczba)Kody albo pełne odpowiedzi
Wielokrotny wybórJedna komórka, opcje rozdzielone „, ”Osobna kolumna dla każdej opcji
Etykiety dla SPSSBrak – trzeba je nadaćZapisane w pliku .sav
Ankiety przerwaneNie zapisują sięZapisują się – filtruj stan ukończenia

Pobrany plik zapisz w folderze z danymi surowymi i nigdy go nie edytuj – zmiany wykonuj w kopii za pomocą skryptu. Wilson i in. (2017) zaliczają zachowanie surowych danych i zapis kroków przetwarzania w kodzie do „wystarczająco dobrych” praktyk, dostępnych także bez przygotowania informatycznego.

Zasady porządnego zbioru danych

Docelowy plik powinien mieć postać, którą Wickham (2014) nazwał danymi uporządkowanymi (ang. tidy data): każda zmienna to kolumna, każda obserwacja to wiersz, a każdy rodzaj jednostki obserwacji – osobna tabela. W ankiecie oznacza to jedną osobę w wierszu i jedną odpowiedź (albo jedną opcję pytania wielokrotnego wyboru) w kolumnie. Taki układ przyjmą bez przeróbek R, SPSS, JASP i jamovi. Broman i Woo (2018) dodają praktyczne reguły pracy z arkuszem:

  • bądź konsekwentny („Kobieta”, a nie raz „kobieta”, raz „K”), a daty zapisuj jako RRRR-MM-DD;
  • nie zostawiaj pustych komórek bez znaczenia i trzymaj jedną informację w komórce;
  • dane to jeden prostokąt z jednym wierszem nagłówka – bez scalonych komórek i podsumowań;
  • przygotuj słownik danych, nie licz niczego w pliku surowym, nie koduj informacji kolorem i zapisuj dane w plikach tekstowych (CSV).

Osobna przestroga dotyczy Excela. Ziemann i in. (2016) przeszukali artykuły z czołowych czasopism genomicznych i stwierdzili, że mniej więcej co piąty artykuł z listami genów w Excelu zawierał błędy powstałe przez automatyczną zamianę nazw genów na daty i liczby. W ankiecie ten sam mechanizm potrafi zamienić odpowiedź „1-2” w datę albo usunąć zera z kodu uczestnika („007” → 7). Plik CSV otwieraj w programie do analizy, a nie podwójnym kliknięciem w Excelu.

Kodowanie danych z ankiety krok po kroku

Van den Broeck i in. (2005) opisują czyszczenie danych jako powtarzany cykl: przesiew (szukanie podejrzanych wartości), diagnoza (błąd, brak czy prawdziwa wartość skrajna) i edycja. Reguły postępowania z błędami, brakami i wartościami skrajnymi radzą ustalić z góry – zapisz je, zanim otworzysz dane.

Przykładem jest symulowany eksport z Formularzy Google (pobierz plik CSV): 126 wierszy i 13 kolumn. Są w nim zgoda na udział, wiek, płeć, sześć stwierdzeń o stresie związanym ze studiami (siatka z pięciostopniową skalą zgody, pozycje 2 i 5 odwrócone), pytanie wielokrotnego wyboru o formy wsparcia, liczba godzin nauki wpisywana ręcznie i samopoczucie na skali liniowej 1–10. Liczby poniżej pochodzą z kodu w sekcji Przykład w R.

Krok 1. Nadaj zmiennym krótkie nazwy

Nazwa zmiennej ma być krótka i bezpieczna w każdym programie: litery bez polskich znaków, cyfry i podkreślnik, na początku litera, bez spacji. Pozycje jednej skali nazwij wspólnym przedrostkiem z numerem (str_01…str_06), a pozycje po odwróceniu oznacz przyrostkiem _r. Pełnej treści pytania nie wyrzucaj – zapisz ją jako etykietę zmiennej i w książce kodowej.

Przykłady zamiany nagłówków eksportu na nazwy i etykiety zmiennych
Nagłówek w eksporcieNazwa zmiennejEtykieta zmiennej
Sygnatura czasowaczasCzas wysłania formularza
Ile masz lat?wiekWiek (lata)
Na ile zgadzasz się z poniższymi stwierdzeniami? [Zwykle spokojnie podchodzę do sesji egzaminacyjnej.]str_02, po odwróceniu str_02_rZwykle spokojnie podchodzę do sesji egzaminacyjnej.
Z jakich form wsparcia korzystasz, gdy studia Cię stresują?wsparcie → wsp_rodzina, wsp_sport…Wsparcie: Rozmowa z rodziną itd.

Krok 2. Usuń odpowiedzi testowe, osoby bez zgody i duplikaty

W przykładowym pliku są trzy rodzaje rekordów, których nie analizujesz: 2 próbne wypełnienia sprzed daty rozpoczęcia badania (rozpoznasz je po sygnaturze czasowej i wpisie „test”), 1 rekord osoby bez zgody („Nie wyrażam zgody” – zob. świadoma zgoda i RODO w badaniach) oraz 3 duplikaty, czyli identyczne odpowiedzi wysłane ponownie od 6 do 41 sekund po pierwszych – zwykle skutek dwukrotnego kliknięcia „Prześlij”. Po tych krokach zostaje 120 osób.

Duplikaty usuwaj ostrożnie: w krótkiej ankiecie dwie osoby mogą odpowiedzieć tak samo, więc sprawdź też odstęp czasu albo kod uczestnika. Jeśli badanie pilotażowe odbyło się na tym samym formularzu, zanotuj, do kiedy trwało. Każde wykluczenie policz – te liczby trafią do opisu próby.

Osobnym etapem jest wykrywanie odpowiedzi nieuważnych: zbyt szybkich, jednakowych w całej siatce albo niezgodnych z pytaniem kontrolnym. Ward i Meade (2023) zwracają uwagę, że ankiety internetowe są na nie szczególnie podatne. Kryteria ustal z góry (zob. nieuważne odpowiedzi w ankietach online i straightlining).

Krok 3. Zamień odpowiedzi słowne na liczby

Odpowiedzi ze skali Likerta zapisane słowami zamieniasz na liczby według jawnej mapy, w której każdej etykiecie odpowiada jeden kod – to najprostsza postać rekodowania:

Mapa kodów dla pięciostopniowej skali zgody i kody nadawane alfabetycznie
Odpowiedź w eksporciePoprawny kodKod alfabetyczny (błędny)
Zdecydowanie się nie zgadzam14
Raczej się nie zgadzam22
Ani się zgadzam, ani się nie zgadzam31
Raczej się zgadzam43
Zdecydowanie się zgadzam55

Ostatnia kolumna pokazuje najgroźniejszą pułapkę tego etapu. Funkcja factor() w R bez podanej kolejności poziomów i automatyczne rekodowanie w SPSS nadają kody alfabetycznie: „Ani się zgadzam…” dostaje 1, a „Zdecydowanie się nie zgadzam” – 4. Liczby mieszczą się w zakresie 1–5, więc błąd łatwo przeoczyć, ale porządek skali jest zniszczony, a każda średnia czy korelacja – bezwartościowa.

Przed rekodowaniem sprawdź, czy w danych nie ma etykiet spoza mapy: literówek, starej wersji odpowiedzi czy spacji na końcu. W przykładzie w żadnej z 720 komórek siatki (120 osób × 6 pozycji) nie było takiej etykiety. Wartości spoza mapy nie zamieniaj na brak „po cichu” – najpierw je wypisz.

Krok 4. Przekoduj pozycje odwrócone

Pozycje odwrócone są sformułowane w kierunku przeciwnym do reszty skali – zgoda ze stwierdzeniem „Zwykle spokojnie podchodzę do sesji egzaminacyjnej” oznacza mniej stresu, a nie więcej. Przed policzeniem wyniku przekoduj je według wzoru:

xodwr = (min + max) − x

Dla skali 1–5 to 6 − x (1 ↔ 5, 2 ↔ 4, 3 bez zmian), dla 1–7 – 8 − x. Wynik zapisz w nowej zmiennej (str_02_r), a oryginał zostaw. Klucz odwróceń bierz z publikacji lub podręcznika narzędzia, a nie z danych.

Zapomniane odwrócenie łatwo wykryć: pozycja, której nie odwrócono, koreluje z sumą pozostałych pozycji ujemnie (rysunek 1).

Wykres słupkowy korelacji sześciu pozycji skali stresu z sumą pozostałych pozycji: przed odwróceniem pozycje 2 i 5 mają korelacje −.68, a alfa Cronbacha wynosi −.36; po odwróceniu wszystkie korelacje mieszczą się między .70 a .76, a alfa wynosi .90
Rysunek 1. Korelacja każdej z sześciu pozycji skali stresu z sumą pozostałych pozycji przed odwróceniem i po odwróceniu pozycji 2 i 5 (czerwone słupki), N = 120. Obliczenia: R (dane symulowane).

Przed odwróceniem pozycje 2 i 5 korelowały z resztą skali na poziomie −.68, a alfa Cronbacha była ujemna (α = −.36). Po odwróceniu korelacje mieściły się między .70 a .76, a α = .90. Ujemna alfa sygnalizuje, że część pozycji ma kierunek przeciwny do pozostałych – zanim napiszesz w pracy o słabej spójności wewnętrznej, sprawdź klucz (więcej w poradniku o alfie Cronbacha).

Krok 5. Rozbij pytania wielokrotnego wyboru na zmienne 0/1

Pytanie z polami wyboru – kafeteria wielokrotnego wyboru – zapisuje w Formularzach Google wszystkie zaznaczenia w jednej komórce, np. „Rozmowa z przyjaciółmi, Sport, aktywność fizyczna, medytacja”. Do analizy potrzebujesz osobnej zmiennej dla każdej opcji: 1 = zaznaczono, 0 = nie zaznaczono. Osoba, która pominęła całe pytanie, dostaje braki danych, a nie same zera.

Najprostszy pomysł – podzielić tekst po przecinku – zawodzi, gdy przecinek występuje w treści opcji. W przykładzie opcja „Sport, aktywność fizyczna” rozpadła się na „Sport” i „aktywność fizyczna” (po 47 wskazań), a wpisy z pola „Inne” utworzyły trzy osobne mini-kategorie (rysunek 2).

Dwa wykresy słupkowe częstości form wsparcia: po podziale tekstu po przecinku opcja Sport, aktywność fizyczna rozpada się na dwie kategorie po 47 osób, a odpowiedzi z pola Inne tworzą trzy małe kategorie; po dopasowaniu pełnych etykiet jest sześć zmiennych, w tym rozmowa z przyjaciółmi 79 osób (67.5%) i inne 12 osób (10.3%)
Rysunek 2. Ta sama kolumna z pytaniem wielokrotnego wyboru zakodowana na dwa sposoby. Czerwone słupki to kategorie powstałe przez błędny podział tekstu. Odsetki liczono względem 117 osób, które odpowiedziały na pytanie. Obliczenia: R (dane symulowane).

Poprawnie jest wyszukiwać w tekście pełne etykiety opcji, a do zmiennej „inne” zaliczyć osoby, którym po usunięciu znanych etykiet został jakiś tekst. Najczęściej wskazywano rozmowę z przyjaciółmi (79 z 117 osób, które odpowiedziały na pytanie, czyli 67.5%), a 12 osób (10.3%) wpisało własną odpowiedź. Odsetki sumują się do ponad 100%, bo można było wskazać kilka opcji. Wpisy z pola „Inne” przejrzyj ręcznie i w razie potrzeby zakoduj jak odpowiedzi na pytania otwarte.

To nie to samo co kodowanie zero-jedynkowe predyktora w regresji: tam zmienna nominalna z k wykluczającymi się kategoriami daje k − 1 wskaźników, a tu każda opcja jest osobną zmienną i jedna osoba może mieć kilka jedynek. Ten krok automatyzuje procedura rekodowania pytań wielokrotnego wyboru z Formularzy Google w aplikacji SZTOS (zob. oprogramowanie naukowe).

Krok 6. Oznacz braki danych

Pusta komórka zwykle oznacza pominięte pytanie, a „nie wiem”, „nie dotyczy” czy „wolę nie odpowiadać” to inne sytuacje – nie łącz ich. Broman i Woo (2018) radzą oznaczać braki konsekwentnie jednym kodem.

  • W R brak to NA; read_csv() domyślnie zamienia na nie puste komórki, a kody w rodzaju −99 zamień samodzielnie.
  • W SPSS zdefiniuj kody w kolumnie Braki danych w widoku zmiennych (np. −99 = odmowa, −98 = nie dotyczy). Niezdefiniowany kod program policzy jak liczbę – jedno −99 psuje średnią.
  • Nie wpisuj braku jako 0, jeśli 0 jest możliwą odpowiedzią albo zmienna wchodzi do sumy.

W przykładzie w siatce brakowało 11 odpowiedzi, a 3 osoby pominęły pytanie o wsparcie. O mechanizmach braków i ich uzupełnianiu piszemy w haśle braki danych: MCAR, MAR i MNAR i w poradniku o imputacji wielokrotnej w R.

Krok 7. Popraw liczby, daty i godziny

Pola tekstowe przynoszą liczby w różnych postaciach: „21”, „22 lata”, „2,5”, „1.5”, „3 h”. Funkcja parse_number() z pakietu readr wyciąga liczbę z tekstu („22 lata” → 22), ale przecinek traktuje jako separator tysięcy, więc z „2,5” robi 25. Najpierw zamień przecinek na kropkę, potem konwertuj, a na końcu obejrzyj minimum i maksimum – w przykładzie wiek mieścił się w przedziale 19–26 lat, a czas nauki od 1 do 5 godzin, więc nic nie wskazywało na błąd wpisu.

Data i godzina z polskiego arkusza mają postać dzień.miesiąc.rok (14.03.2026 03:18:11) – w R zamienisz je funkcją dmy_hms() z pakietu lubridate, a w plikach dla innych zapisuj je jako RRRR-MM-DD (Broman i Woo, 2018). Formularze Google zapisują tylko moment wysłania, więc nie policzysz z nich czasu wypełniania; LimeSurvey może go zapisywać po włączeniu tej opcji w ustawieniach ankiety.

Krok 8. Policz wyniki skal

Wynik skali licz po odwróceniu pozycji – jako sumę albo średnią, zgodnie z zaleceniem autora narzędzia. Średnia pozostaje w skali odpowiedzi (1–5) i łatwo ją policzyć mimo pojedynczych braków. Minimalną liczbę odpowiedzi ustal z góry: w przykładzie wynik liczono, gdy osoba odpowiedziała na co najmniej 5 z 6 pozycji. Jedna osoba odpowiedziała tylko na 4, więc nie ma wyniku skali (n = 119, M = 2.94, SD = 1.02). Suma z niepełnych odpowiedzi zaniżyłaby jej wynik.

Odpowiedź na pojedynczą pozycję Likerta jest porządkowa, a Sullivan i Artino (2013) podkreślają, że połączenie pozycji w jeden wynik trzeba uzasadnić dowodami rzetelności lub struktury skali. Dlatego obok wyniku skali podaj jej rzetelność – gotowe sformułowania znajdziesz we wzorze raportowania alfy Cronbacha.

Krok 9. Zapisz plik dla SPSS i książkę kodową

Jeśli promotor albo zespół pracuje w SPSS, zapisz gotowy zbiór jako .sav funkcją write_sav() z pakietu haven, który importuje i eksportuje pliki SPSS, Stata i SAS (Wickham i in., 2025). Przed zapisem nadaj zmiennym etykiety (treść pytania), a kodom – etykiety wartości. Pozycje odwrócone dostają odwrócone etykiety: w str_02_r wartość 1 to „Zdecydowanie się zgadzam”. Na koniec wczytaj plik ponownie i sprawdź, co zobaczy SPSS. Plik .sav otworzysz także w PSPP, JASP i jamovi.

Książka kodowa (codebook): wzór

Książka kodowa, czyli słownik danych, opisuje każdą zmienną: nazwę, treść pytania, typ, kody, braki i przekształcenia. Buchanan i in. (2021) prowadzą od surowych odpowiedzi z ankiety do udostępnionego zbioru danych z metadanymi zgodnymi z zasadami FAIR, a Arslan (2019) opisuje pakiet R codebook, który tworzy taką dokumentację automatycznie – razem z rzetelnością skal, statystykami opisowymi i wzorcami braków. Prostą wersję przygotujesz w tabeli:

Wzór książki kodowej dla przykładowej ankiety
ZmiennaPytanie lub etykietaTyp i zakresKody i etykietyBrakiPrzekształcenie
wiekIle masz lat?liczba (lata)–pusta komórkaliczba z tekstu („21 lat” → 21)
str_01Czuję się przytłoczony(-a) liczbą obowiązków na studiach.porządkowa, 1–51 = Zdecydowanie się nie zgadzam … 5 = Zdecydowanie się zgadzampusta komórkatekst → kod według mapy
str_02_rZwykle spokojnie podchodzę do sesji egzaminacyjnej. (odwrócona)porządkowa, 1–51 = Zdecydowanie się zgadzam … 5 = Zdecydowanie się nie zgadzampusta komórka6 − str_02
wsp_sportWsparcie: Sport, aktywność fizyczna0/10 = nie zaznaczono, 1 = zaznaczonopytanie pominiętewyszukanie pełnej etykiety w kolumnie wsparcie
wsp_inneWsparcie: inne (wpisane)0/10 = nie, 1 = takpytanie pominięte1, gdy po usunięciu znanych opcji został tekst
stresStres akademicki – wynik skaliśrednia, 1–5wyższy wynik = silniejszy stresmniej niż 5 odpowiedziśrednia z str_01, str_02_r, str_03, str_04, str_05_r, str_06

Drugi przepis w sekcji z kodem tworzy podstawową książkę kodową (nazwa, etykieta, kody) automatycznie z etykiet zapisanych w pliku – pobierz przykład w formacie .xlsx i uzupełnij go o braki i przekształcenia. Dołącz książkę kodową do pracy jako aneks albo do repozytorium danych, jeśli udostępniasz je w duchu otwartej nauki.

Przykład reprodukowalny

Przykład w R

Dwa przepisy prowadzą od pliku CSV z Formularzy Google do gotowego pliku .sav i książki kodowej. Liczby w tekście i na rysunkach 1–2 pochodzą z tego kodu.

Czyszczenie i kodowanie (kroki 1–8)

Dane wejściowe: plik odpowiedzi-google-forms.csv w katalogu roboczym (126 wierszy, 13 kolumn, dane symulowane).

Co odczytać: liczbę wykluczonych rekordów, kody poprawne i alfabetyczne, liczebności opcji wsparcia, korelacje pozycji z resztą skali i alfę przed odwróceniem i po nim oraz tę samą osobę przed kodowaniem i po nim.

R
library(readr); library(dplyr); library(stringr); library(lubridate)

surowe <- read_csv("odpowiedzi-google-forms.csv",
                   col_types = cols(.default = col_character()))   # wszystko jako tekst
dim(surowe)
pytania <- names(surowe)                 # pełne treści pytań przydadzą się jako etykiety

# Krok 1. Krótkie nazwy zmiennych (w kolejności kolumn eksportu)
names(surowe) <- c("czas", "zgoda", "wiek", "plec", sprintf("str_%02d", 1:6),
                   "wsparcie", "nauka_h", "samopoczucie")

# Krok 2. Odpowiedzi testowe, brak zgody, podwójne wysłanie formularza
table(przed_startem = dmy_hms(surowe$czas) < ymd("2026-03-02"), surowe$zgoda)
dane <- surowe |>
  mutate(czas = dmy_hms(czas)) |>
  filter(czas >= ymd("2026-03-02"),          # testy sprzed startu badania
         zgoda == "Wyrażam zgodę")           # osoby bez zgody kończą ankietę
sum(duplicated(select(dane, -czas)))         # te same odpowiedzi wysłane ponownie
dane <- distinct(dane, pick(-czas), .keep_all = TRUE)
nrow(dane)

# Krok 3. Tekst skali Likerta -> liczby 1–5 według jawnej mapy
likert <- c("Zdecydowanie się nie zgadzam" = 1, "Raczej się nie zgadzam" = 2,
            "Ani się zgadzam, ani się nie zgadzam" = 3, "Raczej się zgadzam" = 4,
            "Zdecydowanie się zgadzam" = 5)
odp <- unlist(select(dane, str_01:str_06))
table(poza_mapa = !(odp %in% names(likert)) & !is.na(odp))   # literówki, inne etykiety?
data.frame(poprawny = likert, alfabetyczny = as.numeric(factor(names(likert))))  # pułapka
dane <- mutate(dane, across(str_01:str_06, \(x) unname(likert[x])))

# Krok 4. Pozycje odwrócone (2 i 5): nowa wartość = 6 - stara
dane <- mutate(dane, across(c(str_02, str_05), \(x) 6 - x, .names = "{.col}_r"))

# Krok 5. Pytanie wielokrotnego wyboru -> osobna zmienna 0/1 dla każdej opcji
opcje <- c(wsp_rodzina = "Rozmowa z rodziną", wsp_przyjaciele = "Rozmowa z przyjaciółmi",
           wsp_sport = "Sport, aktywność fizyczna",
           wsp_psycholog = "Pomoc psychologa lub psychoterapeuty",
           wsp_brak = "Nie korzystam z żadnej formy wsparcia")
for (v in names(opcje)) dane[[v]] <- as.integer(str_detect(dane$wsparcie, fixed(opcje[[v]])))
reszta <- str_remove_all(dane$wsparcie, paste(opcje, collapse = "|"))
dane$wsp_inne <- as.integer(str_detect(reszta, "[[:alpha:]]"))   # tekst wpisany w „Inne”
colSums(select(dane, starts_with("wsp_")), na.rm = TRUE)

# Krok 6. Liczby wpisane jako tekst
nauka_przyklad <- c("2", "2,5", "1.5", "3 h")
rbind(parse_number(nauka_przyklad),                           # „2,5” -> 25 (przecinek!)
      parse_number(str_replace(nauka_przyklad, ",", ".")))    # poprawnie
dane <- mutate(dane,
  wiek = parse_number(wiek),                                  # „22 lata” -> 22
  nauka_h = parse_number(str_replace(nauka_h, ",", ".")),
  samopoczucie = as.integer(samopoczucie),
  plec = factor(plec, levels = c("Kobieta", "Mężczyzna", "Inna", "Wolę nie odpowiadać")))

# Krok 7. Wynik skali: średnia, gdy osoba odpowiedziała na co najmniej 5 z 6 pozycji
pozycje <- c("str_01", "str_02_r", "str_03", "str_04", "str_05_r", "str_06")
dane <- mutate(dane,
  n_odp = rowSums(!is.na(pick(all_of(pozycje)))),
  stres = if_else(n_odp >= 5, rowMeans(pick(all_of(pozycje)), na.rm = TRUE), NA))
table(dane$n_odp)
round(c(M = mean(dane$stres, na.rm = TRUE), SD = sd(dane$stres, na.rm = TRUE)), 2)

# Kontrola: korelacja pozycji z sumą pozostałych i alfa Cronbacha przed i po odwróceniu
r_reszta <- function(d) sapply(names(d), \(v) cor(d[[v]], rowSums(d[setdiff(names(d), v)]),
                                                  use = "complete.obs"))
alfa <- function(d) { d <- na.omit(d); k <- ncol(d)
  k / (k - 1) * (1 - sum(sapply(d, var)) / var(rowSums(d))) }
przed <- select(dane, str_01:str_06); po <- select(dane, all_of(pozycje))
round(rbind(przed = unname(r_reszta(przed)), po = unname(r_reszta(po))), 2)
round(c(alfa_przed = alfa(przed), alfa_po = alfa(po)), 2)

# Przed i po: ta sama osoba
surowe |> filter(czas == "14.03.2026 03:18:11") |> select(wiek, str_02, wsparcie, nauka_h) |> glimpse()
dane |> filter(czas == dmy_hms("14.03.2026 03:18:11")) |>
  select(wiek, str_02, str_02_r, wsp_przyjaciele, wsp_sport, wsp_inne, nauka_h, stres) |> glimpse()
Wynik w R
[1] 126  13
             
przed_startem Nie wyrażam zgody Wyrażam zgodę
        FALSE                 1           123
        TRUE                  0             2
[1] 3
[1] 120
poza_mapa
FALSE 
  720 
                                     poprawny alfabetyczny
Zdecydowanie się nie zgadzam                1            4
Raczej się nie zgadzam                      2            2
Ani się zgadzam, ani się nie zgadzam        3            1
Raczej się zgadzam                          4            3
Zdecydowanie się zgadzam                    5            5
    wsp_rodzina wsp_przyjaciele       wsp_sport   wsp_psycholog        wsp_brak 
             53              79              47              15              10 
       wsp_inne 
             12 
     [,1] [,2] [,3] [,4]
[1,]    2 25.0  1.5    3
[2,]    2  2.5  1.5    3

  4   5   6 
  1   9 110 
   M   SD 
2.94 1.02 
      [,1]  [,2] [,3] [,4]  [,5] [,6]
przed 0.38 -0.68 0.33 0.39 -0.68 0.31
po    0.72  0.76 0.70 0.76  0.75 0.70
alfa_przed    alfa_po 
     -0.36       0.90 
Rows: 1
Columns: 4
$ wiek     <chr> "21 lat"
$ str_02   <chr> "Zdecydowanie się zgadzam"
$ wsparcie <chr> "Rozmowa z przyjaciółmi, Sport, aktywność fizyczna, medytacja"
$ nauka_h  <chr> "2,5"
Rows: 1
Columns: 8
$ wiek            <dbl> 21
$ str_02          <dbl> 5
$ str_02_r        <dbl> 1
$ wsp_przyjaciele <int> 1
$ wsp_sport       <int> 1
$ wsp_inne        <int> 1
$ nauka_h         <dbl> 2.5
$ stres           <dbl> 2

Zapis do SPSS (.sav) i książka kodowa (krok 9)

Dane wejściowe: ramka dane i obiekty pytania, likert, pozycje, opcje z poprzedniego przepisu.

Co odczytać: etykietę zmiennej i odwrócone etykiety wartości pozycji 2 po ponownym wczytaniu pliku .sav oraz fragment automatycznie utworzonej książki kodowej.

R
library(haven)
etykiety_r <- sort(setNames(6 - likert, names(likert)))   # pozycje odwrócone: 1 = „Zdecydowanie się zgadzam”
sav <- dane |>
  select(wiek, plec, all_of(pozycje), starts_with("wsp_"), nauka_h, samopoczucie, stres) |>
  mutate(across(c(str_01, str_03, str_04, str_06), \(x) labelled(x, likert)),
         across(c(str_02_r, str_05_r), \(x) labelled(x, etykiety_r)),
         across(starts_with("wsp_"), \(x) labelled(x, c("nie zaznaczono" = 0L, "zaznaczono" = 1L))))
tresc <- str_match(pytania[5:10], "\\[(.*)\\]")[, 2]       # treść stwierdzeń z nagłówków eksportu
etykiety <- c(wiek = "Wiek (lata)", plec = "Płeć", setNames(tresc, pozycje),
              setNames(paste("Wsparcie:", c(opcje, "inne (wpisane)")), c(names(opcje), "wsp_inne")),
              nauka_h = "Nauka: godziny dziennie", samopoczucie = "Samopoczucie (1–10)",
              stres = "Stres akademicki: średnia z 6 pozycji (min. 5 odpowiedzi)")
etykiety[c("str_02_r", "str_05_r")] <- paste(etykiety[c("str_02_r", "str_05_r")], "(odwrócona)")
for (v in names(etykiety)) attr(sav[[v]], "label") <- etykiety[[v]]
write_sav(sav, "stres-studia.sav")

spr <- read_sav("stres-studia.sav")                      # kontrola: co zobaczy SPSS?
attr(spr$str_02_r, "label")
print_labels(spr$str_02_r)
ksiazka <- tibble(zmienna = names(spr),
                  etykieta = sapply(spr, \(x) attr(x, "label") %||% ""),
                  wartosci = sapply(spr, \(x) { l <- attr(x, "labels")
                    if (is.null(l)) "" else paste(l, names(l), sep = " = ", collapse = "; ") }))
writexl::write_xlsx(ksiazka, "ksiazka-kodowa.xlsx")
ksiazka |> slice(c(2, 4, 9)) |> glimpse()
Wynik w R
[1] "Zwykle spokojnie podchodzę do sesji egzaminacyjnej. (odwrócona)"

Labels:
 value                                label
     1             Zdecydowanie się zgadzam
     2                   Raczej się zgadzam
     3 Ani się zgadzam, ani się nie zgadzam
     4               Raczej się nie zgadzam
     5         Zdecydowanie się nie zgadzam
Rows: 3
Columns: 3
$ zmienna  <chr> "plec", "str_02_r", "wsp_rodzina"
$ etykieta <chr> "Płeć", "Zwykle spokojnie podchodzę do sesji egzaminacyjnej. …
$ wartosci <chr> "1 = Kobieta; 2 = Mężczyzna; 3 = Inna; 4 = Wolę nie odpowiada…

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3; rysunki przygotowano w pakiecie ggplot2. W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. readr (wersja 2.2.0): Wickham, H., Hester, J., & Bryan, J. (2026). readr: Read rectangular text data [R package]. https://doi.org/10.32614/CRAN.package.readr
  3. dplyr (wersja 1.2.0): Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2026). dplyr: A grammar of data manipulation [R package]. https://doi.org/10.32614/CRAN.package.dplyr
  4. stringr (wersja 1.6.0): Wickham, H. (2025). stringr: Simple, consistent wrappers for common string operations [R package]. https://doi.org/10.32614/CRAN.package.stringr
  5. lubridate (wersja 1.9.5): Grolemund, G., & Wickham, H. (2011). Dates and times made easy with lubridate. Journal of Statistical Software, 40(3), 1–25. https://www.jstatsoft.org/v40/i03/
  6. haven (wersja 2.5.5): Wickham, H., Miller, E., & Smith, D. (2025). haven: Import and export 'SPSS', 'Stata' and 'SAS' files [R package]. https://doi.org/10.32614/CRAN.package.haven
  7. writexl (wersja 1.5.4): Ooms, J. (2025). writexl: Export data frames to Excel 'xlsx' format [R package]. https://doi.org/10.32614/CRAN.package.writexl
  8. ggplot2 (wersja 4.0.2): Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org

To samo w SPSS: ścieżki menu

Każdy krok wykonasz też w SPSS. Nazwy poleceń podajemy w polskiej wersji programu, a w nawiasie – w angielskiej.

  1. Import: Plik → Importuj dane → Dane CSV (File → Import Data → CSV Data) z kodowaniem UTF-8; nazwy i etykiety wpiszesz w widoku zmiennych (Variable View).
  2. Wykluczenia: Dane → Wybierz obserwacje (Data → Select Cases); duplikaty oznaczy Dane → Identyfikuj duplikaty obserwacji (Data → Identify Duplicate Cases).
  3. Tekst → liczby: Przekształcenia → Rekoduj na inne zmienne (Transform → Recode into Different Variables), przycisk Wartości stare i nowe: stara wartość to dokładny tekst etykiety, nowa – kod. Wynik sprawdź tabelą krzyżową starej i nowej zmiennej.
  4. Automatyczne rekodowanie (Przekształcenia → Automatyczne rekodowanie, Transform → Automatic Recode) nadaje kody alfabetycznie – użyj go do zmiennych nominalnych, nie do skal.
  5. Pozycje odwrócone: Rekoduj na inne zmienne (1→5, 2→4, 3→3, 4→2, 5→1) albo Przekształcenia → Oblicz wartości (Transform → Compute Variable) z wyrażeniem 6 - str_02.
  6. Wielokrotny wybór: Oblicz wartości z wyrażeniem CHAR.INDEX(wsparcie, 'Sport, aktywność fizyczna') > 0 (1 = opcję zaznaczono; osobom, które pominęły pytanie, przypisz brak). Częstości opcji policzysz w Analiza → Odpowiedzi wielokrotne (Analyze → Multiple Response).
  7. Braki i wynik skali: kody braków wpisz w kolumnie Braki danych (Missing), a wynik policz w Oblicz wartości wyrażeniem MEAN.5(str_01, str_02_r, str_03, str_04, str_05_r, str_06) – średnia powstanie tylko u osób z co najmniej 5 ważnymi odpowiedziami.

W każdym oknie zamiast OK kliknij Wklej (Paste) – SPSS zapisze polecenie w pliku składni, który uruchomisz ponownie i dołączysz do dokumentacji. Wcześniejsze etapy opisujemy w poradniku jak zrobić ankietę do pracy dyplomowej, a pytania demograficzne – w haśle metryczka.

Jak opisać przygotowanie danych w pracy

W rozdziale Metoda – w części o procedurze albo o analizie danych – napisz, skąd pochodzą dane, kogo wykluczono i dlaczego, jak zakodowano odpowiedzi i jak policzono wyniki skal. Opis dla przykładu z tego wpisu:

Dane zebrano za pomocą Formularzy Google od 2 do 15 marca 2026 r. Eksport zawierał 126 rekordów. Usunięto 2 próbne wypełnienia sprzed rozpoczęcia badania, 1 rekord osoby, która nie wyraziła zgody na udział, oraz 3 duplikaty (identyczne odpowiedzi przesłane ponownie w odstępie od 6 do 41 s). Analizy objęły N = 120 osób. Odpowiedzi na stwierdzenia skali stresu akademickiego zakodowano od 1 (zdecydowanie się nie zgadzam) do 5 (zdecydowanie się zgadzam), a pozycje 2 i 5 zrekodowano odwrotnie. Wynik skali obliczono jako średnią odpowiedzi u osób, które odpowiedziały na co najmniej 5 z 6 pozycji (n = 119; M = 2.94, SD = 1.02; α = .90). Pytanie wielokrotnego wyboru o formy wsparcia zakodowano jako sześć zmiennych zero-jedynkowych (1 = opcja zaznaczona). Przekształcenia wykonano w R 4.5.3 (pakiety readr, dplyr, stringr, lubridate i haven); skrypt i książka kodowa stanowią załącznik do pracy.

Liczby wykluczeń przenieś też do opisu próby (zob. jak opisać charakterystykę próby), a akapit wpasuj w rozdział metodologiczny.

Najczęstsze błędy

  • Ręczne poprawki w Excelu – nie da się ich odtworzyć, a Excel potrafi sam zamienić odpowiedzi w daty (Ziemann i in., 2016).
  • Kody alfabetyczne dla skali Likerta – factor() bez podanej kolejności i automatyczne rekodowanie w SPSS układają etykiety alfabetycznie, a nie według skali.
  • Nieodwrócone pozycje – objawy to ujemne korelacje pozycji z resztą skali i niska albo ujemna alfa Cronbacha.
  • Podział wielokrotnych odpowiedzi po przecinku, gdy przecinek jest w treści opcji, oraz zera zamiast braków u osób, które pominęły pytanie.
  • Kod braku policzony jak liczba – −99 niezdefiniowane jako brak w SPSS albo pozostawione w danych w R.
  • Zmiany w formularzu w trakcie badania – ta sama odpowiedź występuje potem w dwóch wersjach, a pytanie usunięte i dodane ponownie tworzy nową kolumnę. Zapisz datę zmiany i ujednolij kody.
  • Brak dokumentacji – bez książki kodowej i skryptu nikt, także Ty za pół roku, nie odtworzy wyników.

Najczęstsze pytania

Jak przenieść dane z Google Forms do SPSS?

Pobierz odpowiedzi jako CSV (Odpowiedzi → ⋮ → Pobierz odpowiedzi) albo połącz formularz z Arkuszem Google i pobierz plik .xlsx. W SPSS wybierz Plik → Importuj dane → Dane CSV z kodowaniem UTF-8, nadaj krótkie nazwy zmiennych i zrekoduj odpowiedzi słowne na liczby (Przekształcenia → Rekoduj na inne zmienne). Możesz też przygotować dane w R i zapisać je jako .sav funkcją haven::write_sav().

Jak zamienić odpowiedzi tekstowe ze skali Likerta na liczby?

Przygotuj mapę, w której każdej etykiecie (np. „Raczej się zgadzam”) odpowiada jeden kod (4), i zrekoduj według niej wszystkie pozycje – w R nazwanym wektorem, w SPSS poleceniem Rekoduj na inne zmienne. Nie używaj automatycznego rekodowania ani factor() bez podanej kolejności poziomów, bo nadają kody alfabetycznie i niszczą porządek skali.

Jak zakodować pytanie wielokrotnego wyboru z Google Forms?

Utwórz osobną zmienną 0/1 dla każdej opcji: 1, gdy pełna etykieta opcji występuje w komórce, 0, gdy nie. Nie dziel tekstu po przecinku, bo przecinek bywa częścią opcji. Osobie, która pominęła pytanie, wpisz brak danych, a tekst z pola „Inne” zakoduj w osobnej zmiennej.

Jak odwrócić pozycję w skali 1–5?

Użyj wzoru (min + max) − x, czyli 6 − x: 1 zamienia się w 5, 2 w 4, a 3 zostaje bez zmian. Dla skali 1–7 to 8 − x. Wynik zapisz w nowej zmiennej (np. str_02_r), a w pliku SPSS odwróć też etykiety wartości.

Czy z LimeSurvey eksportować kody odpowiedzi czy pełne odpowiedzi?

Do analizy wybierz kody odpowiedzi i kody pytań jako nagłówki – najlepiej w formacie SPSS (.sav), który zawiera etykiety zmiennych i wartości. Pełne odpowiedzi przydają się do czytania i kontroli, ale tekst i tak trzeba by potem rekodować.

Co to jest książka kodowa i czy dołączyć ją do pracy?

Książka kodowa opisuje każdą zmienną w pliku: nazwę, treść pytania, typ, kody i ich znaczenie, kody braków oraz przekształcenia. Dołącz ją jako aneks albo do repozytorium danych – dzięki niej promotor, recenzent i Ty sam odtworzycie analizę.

Powiązane hasła

Przeczytaj też

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Arslan, R. C. (2019). How to automatically document data with the codebook package to facilitate data reuse. Advances in Methods and Practices in Psychological Science, 2(2), 169–187. https://doi.org/10.1177/2515245919838783 ● Otwarty dostęp
  2. Broman, K. W., & Woo, K. H. (2018). Data organization in spreadsheets. The American Statistician, 72(1), 2–10. https://doi.org/10.1080/00031305.2017.1375989 ● Otwarty dostęp: pełny tekst
  3. Buchanan, E. M., Crain, S. E., Cunningham, A. L., Johnson, H. R., Stash, H., Papadatou-Pastou, M., Isager, P. M., Carlsson, R., & Aczel, B. (2021). Getting started creating data dictionaries: How to create a shareable data set. Advances in Methods and Practices in Psychological Science, 4(1), Article 2515245920928007. https://doi.org/10.1177/2515245920928007 ● Otwarty dostęp
  4. Ellis, S. E., & Leek, J. T. (2018). How to share data for collaboration. The American Statistician, 72(1), 53–57. https://doi.org/10.1080/00031305.2017.1375987 ● Otwarty dostęp: pełny tekst
  5. Google. (b.d.). View & manage form responses. Google Docs Editors Help. Pobrano 15 października 2026 z https://support.google.com/docs/answer/139706 ● Otwarty dostęp
  6. LimeSurvey. (2026). Export responses. LimeSurvey Manual. https://manual.limesurvey.org/Export_responses ● Otwarty dostęp
  7. Sullivan, G. M., & Artino, A. R., Jr. (2013). Analyzing and interpreting data from Likert-type scales. Journal of Graduate Medical Education, 5(4), 541–542. https://doi.org/10.4300/JGME-5-4-18 ● Otwarty dostęp
  8. Van den Broeck, J., Argeseanu Cunningham, S., Eeckels, R., & Herbst, K. (2005). Data cleaning: Detecting, diagnosing, and editing data abnormalities. PLoS Medicine, 2(10), Article e267. https://doi.org/10.1371/journal.pmed.0020267 ● Otwarty dostęp
  9. Ward, M. K., & Meade, A. W. (2023). Dealing with careless responding in survey data: Prevention, identification, and recommended best practices. Annual Review of Psychology, 74(1), 577–596. https://doi.org/10.1146/annurev-psych-040422-045007 ● Otwarty dostęp
  10. Wickham, H. (2014). Tidy data. Journal of Statistical Software, 59(10), 1–23. https://doi.org/10.18637/jss.v059.i10 ● Otwarty dostęp
  11. Wickham, H., Miller, E., & Smith, D. (2025). haven: Import and export 'SPSS', 'Stata' and 'SAS' files (Version 2.5.5) [R package]. https://doi.org/10.32614/CRAN.package.haven ● Otwarty dostęp
  12. Wilson, G., Bryan, J., Cranston, K., Kitzes, J., Nederbragt, L., & Teal, T. K. (2017). Good enough practices in scientific computing. PLOS Computational Biology, 13(6), Article e1005510. https://doi.org/10.1371/journal.pcbi.1005510 ● Otwarty dostęp
  13. Ziemann, M., Eren, Y., & El-Osta, A. (2016). Gene name errors are widespread in the scientific literature. Genome Biology, 17(1), Article 177. https://doi.org/10.1186/s13059-016-1044-7 ● Otwarty dostęp

Cytowania BibTeX

@article{arslan2019how, author={Arslan, Ruben C.}, title={{How to automatically document data with the codebook package to facilitate data reuse}}, journal={Advances in Methods and Practices in Psychological Science}, year={2019}, volume={2}, number={2}, pages={169--187}, doi={10.1177/2515245919838783}}
@article{broman2018data, author={Broman, Karl W. and Woo, Kara H.}, title={{Data organization in spreadsheets}}, journal={The American Statistician}, year={2018}, volume={72}, number={1}, pages={2--10}, doi={10.1080/00031305.2017.1375989}}
@article{buchanan2021getting, author={Buchanan, Erin M. and Crain, Sarah E. and Cunningham, Ari L. and Johnson, Hannah R. and Stash, Hannah and Papadatou-Pastou, Marietta and Isager, Peder M. and Carlsson, Rickard and Aczel, Balazs}, title={{Getting started creating data dictionaries: How to create a shareable data set}}, journal={Advances in Methods and Practices in Psychological Science}, year={2021}, volume={4}, number={1}, eid={2515245920928007}, doi={10.1177/2515245920928007}}
@article{ellis2018how, author={Ellis, Shannon E. and Leek, Jeffrey T.}, title={{How to share data for collaboration}}, journal={The American Statistician}, year={2018}, volume={72}, number={1}, pages={53--57}, doi={10.1080/00031305.2017.1375987}}
@misc{googlendview, author={{Google}}, title={{View \& manage form responses}}, howpublished={Google Docs Editors Help}, url={https://support.google.com/docs/answer/139706}}
@misc{limesurvey2026export, author={{LimeSurvey}}, title={{Export responses}}, howpublished={LimeSurvey Manual}, year={2026}, url={https://manual.limesurvey.org/Export_responses}}
@article{sullivan2013analyzing, author={Sullivan, Gail M. and Artino, Jr., Anthony R.}, title={{Analyzing and interpreting data from Likert-type scales}}, journal={Journal of Graduate Medical Education}, year={2013}, volume={5}, number={4}, pages={541--542}, doi={10.4300/jgme-5-4-18}}
@article{vandenbroeck2005data, author={Van den Broeck, Jan and Argeseanu Cunningham, Solveig and Eeckels, Roger and Herbst, Kobus}, title={{Data cleaning: Detecting, diagnosing, and editing data abnormalities}}, journal={PLoS Medicine}, year={2005}, volume={2}, number={10}, eid={e267}, doi={10.1371/journal.pmed.0020267}}
@article{ward2023dealing, author={Ward, M. K. and Meade, Adam W.}, title={{Dealing with careless responding in survey data: Prevention, identification, and recommended best practices}}, journal={Annual Review of Psychology}, year={2023}, volume={74}, number={1}, pages={577--596}, doi={10.1146/annurev-psych-040422-045007}}
@article{wickham2014tidy, author={Wickham, Hadley}, title={{Tidy data}}, journal={Journal of Statistical Software}, year={2014}, volume={59}, number={10}, pages={1--23}, doi={10.18637/jss.v059.i10}}
@misc{wickham2025haven, author={Wickham, Hadley and Miller, Evan and Smith, Danny}, title={{haven: Import and export 'SPSS', 'Stata' and 'SAS' files (R package version 2.5.5) [Computer software]}}, year={2025}, doi={10.32614/cran.package.haven}}
@article{wilson2017good, author={Wilson, Greg and Bryan, Jennifer and Cranston, Karen and Kitzes, Justin and Nederbragt, Lex and Teal, Tracy K.}, title={{Good enough practices in scientific computing}}, journal={PLOS Computational Biology}, year={2017}, volume={13}, number={6}, eid={e1005510}, doi={10.1371/journal.pcbi.1005510}}
@article{ziemann2016gene, author={Ziemann, Mark and Eren, Yotam and El-Osta, Assam}, title={{Gene name errors are widespread in the scientific literature}}, journal={Genome Biology}, year={2016}, volume={17}, number={1}, eid={177}, doi={10.1186/s13059-016-1044-7}}
R