In short
A dataset is a table ready for analysis: one row per unit of analysis — a patient, a stay — and one column per variable. You import it from a file, organize it in folders, and correct it straight in the table. Every change is recorded as a reversible operation: the source file is never touched.
The format analysis expects
The warehouse stores data in long format: one row per measurement, with a column saying what it is. That is the right shape for a warehouse, where you cannot know in advance which variables will exist.
Analysis expects the opposite — wide format: one row per unit of analysis, one column per variable. That is what R, Python and dashboards read. A dataset is that table.
The unit follows from the question, exactly as a cohort’s level does: one row per patient, per hospitalization, per unit stay — or per day of stay when following a trajectory. The same warehouse therefore yields datasets of very different shapes, and it is that unit which determines what a row means.
Both formats are explained in detail elsewhere
Why the difference exists, and how to move between them: Organizing your data.
Datasets live in the project’s lab, beside the dashboards — that is, on the side of what you build, never on the side of source data.
The source file is never modified
This principle governs the whole page, and it is worth understanding before touching anything.
When you correct a cell, add a row or delete a column, Linkr does not write to your file. It records your action in a log, and replays that log over the original file each time it is displayed.
The imported file
Immutable.
Your CSV, Excel or Parquet, exactly as you dropped it in. Nothing is ever written to it.
The operation log
Your corrections, in order.
”this cell now holds this value”, “this column is deleted”. Each one can be undone.
Three practical consequences:
- Nothing is irreversible. The Discard all changes button returns to the original file, however many corrections you made.
- Your corrections are inspectable. The Edit history lists them most recent first, in plain words: “Column weight added (number)”, “Row 42 deleted”.
- You can account for everything. If someone asks why a value differs from the patient record, the answer is in the history.
Editing is off by default
A dataset opens read-only. The Edit data button turns editing on, and that state belongs to the dataset it was turned on for: switching files puts you back in read-only, with no risk of correcting the wrong table by accident.
Creating a dataset
Several routes, depending on where your data comes from.
Import a file
The common case. CSV, TSV, Excel or Parquet, dragged in or picked from disk.
From a script
An R or Python script in the IDE that writes a CSV into the datasets folder sees it appear here automatically.
Create an empty table
For manual entry: you declare the columns, then fill them in. Useful for collecting data on a few dozen patients.
To which add duplicating an existing dataset, and datasets arriving with an imported project.
Importing a file
The import dialog shows a preview of the first ten rows before you confirm anything — that is where reading errors are caught.
It offers an import preset based on where the file came from:
| Preset | What it does |
|---|---|
| Plain table | One row per record, one column per field. No questionnaire structure. |
| Goupile (eCRF) | Joins every form sheet on the record id, and takes its labels from the form dictionary. |
| REDCap | Reads a REDCap export; its data dictionary supplies the questions, choices and branching. |
| XLSForm / ODK | Reads an ODK, KoboToolbox or SurveyCTO export. Multiple-choice answers become one column per option. |
Linkr detects the preset from the file and marks it Detected from the file; you can change it.
For a CSV you adjust the delimiter, the encoding, how many rows to skip and whether there is a header row. For an Excel file, the sheet to read. In the preview, each column header carries its detected type, clickable to force it.
Declare your missing values
The Missing values field lists the tokens to read as empty: by default na, n/a, null, nan, none, #n/a. This is what lets a column stay numeric despite a few NA cells. The hyphen and the full stop are deliberately absent: they are legitimate values too often.
Getting the options wrong does not mean starting over
The original file is kept. Right-click the dataset, then Import settings, to change the delimiter or the encoding and re-read the file — no manual re-import needed.
Working on a dataset
The screen is laid out like an editor: the file tree on the left, the table in the middle, a column statistics panel on the right.
Datasets are arranged in folders — useful as soon as a project holds a dozen of them.

Columns
A column header’s menu offers sorting, pinning, hiding and moving, plus two entries worth a word.
Treat as forces a column’s type: a column of codes read as numbers becomes text again, and leading zeros stop disappearing.
Edit label & description separates two things often conflated:
- the name is technical — the file’s header, the one you write in a script;
- the label is what appears on screen, and it can be translated.
You can also declare value labels: 1 becomes Male, 2 becomes Female, in tables and charts alike, without the data changing.
Renaming a column does not break your dashboards
A column’s internal identifier derives from its name, so renaming changes that key. Linkr repairs the chain in the same action — filters and widgets follow. Only one situation is refused: if the new name would collide with an existing column, the rename is blocked rather than silently pointing your widgets at the wrong column.
Re-importing the same file preserves your dashboards
Column identifiers are derived from names, identically in browser and on the server. An updated file, re-imported, produces the same identifiers: your filters and widgets stay attached. Note that accents and punctuation are normalized away, so Âge and age name the same column.
Correcting data
Once Edit data is on, you edit a cell by clicking it, insert a row above, below or at the end, and add a column.
Two buttons accompany entry: Undo the last change, and the History, which shows how many operations are recorded and lets you discard them all.
Constraining entry
For a dataset filled in by hand, a column’s details accept constraints: required, allowed values (a dropdown rather than a free field), minimum and maximum, and include time of day for a date.
These constraints apply to entry, not to imports
They guide what is typed into Linkr. They do not retroactively reject data already imported: setting a maximum of 120 on an age will not surface outliers in an existing file. To check imported data, see Data quality.
Column statistics
For the selected column, the right-hand panel shows the row count, missing values, unique values and completeness — then, depending on the type, mean, median, standard deviation and distribution, or the time span covered.
This is the reflex to have after an import: 40% completeness on a variable expected everywhere usually signals a reading problem, not a data problem.
Where the data lives
Storage differs with your installation, which explains a few behavioural differences.
Browser mode
Everything stays in your browser.
Rows are held in memory. The limit is your machine’s — a few hundred thousand rows are fine, several million are not.
Server mode
Files live on the server.
The table pulls down one page at a time, which allows far larger volumes. A Refresh button re-reads the folder if files were placed there outside Linkr.
Editing works the same way in both, and the source file stays intact either way.
What goes into an export
A dataset can be large, and can contain patient-level data. It is therefore excluded from versioning by default: what travels is the structure — columns, types, labels — not the rows.
To include a specific file, you mark it explicitly: right-click, Mark for versioning. A badge then flags it in the tree.
Marking a dataset sends it to the git repository
Marking is decided file by file, deliberately. Before marking, check what the file holds: patient-level data pushed to a shared repository does not come back out. See Versioning and export.
Going further
- Dashboards — visualizing a dataset.
- IDE — analyzing it in R or Python.
- Versioning and export — what leaves the project, and what stays.
- Organizing your data — long and wide format.