Opens in a new tab

METHOD GUIDE

Paired Samples t-Test in R
Wide or Long Data, and How Pairs Get Broken

A paired test in R is only as sound as the pairing, and whether the data are laid out wide or long decides whether the pairs are formed correctly. Getting the layout right first is what makes the printed difference, its sign and its interval trustworthy.

IN SHORT

What the Test Estimates and Why Pairing Comes First

A paired samples t-test reduces each participant’s two linked measurements to one difference score, then estimates the mean of those differences with an interval and tests whether it departs from zero. To run a paired samples t-test in R, arrange the data so that each row is one pair, call t.test() on the two measurements, and report the mean difference with its confidence interval. From R 4.4.0 the formula form uses Pair() on wide data. The test is only as valid as the pairing, which is why the layout of the data matters as much as the call. OnlineSPSS, a specialist statistical consultancy for academic, clinical and professional research, carries out and reviews this analysis through an in-house PhD-level statistician.

ANALYSIS SUPPORT

Analysis Support for This Method

Pairing errors run silently in a script, so the layout of the file and the choice between a mean-based and a rank-based paired analysis are checked against the design rather than the console.

Paired Samples t-Test

The analysis of linked measurements within your study design, carried out in R or another program, with the pairing check, the interval and the reporting agreed for your data.

Explore Paired Samples t-Test
Wilcoxon Signed-Rank Test

A rank-based analysis of paired differences, for an ordinal outcome or when the distributional assumptions behind a comparison of mean change are not tenable.

Explore Wilcoxon Signed-Rank Test

BEFORE YOU RUN IT

Get the Pairs Right Before the Test

Pairing happens by position or by row, never by participant ID, so the structure of the data frame is verified before any statistic is read.

One Pair per Participant Each participant contributes one value per condition or time point. Several observations per participant call for a repeated measures model, and unmatched groups call for an independent test.

Wide or Long Layout The paired data format in R that is easiest to verify is wide, with one row per participant. Long data hold one row per measurement and must be reshaped so each participant's two values line up.

The Differences, Not the Scores The distributional question concerns the difference scores. Plot them and note skew and outliers, because the raw scores can look irregular while the differences behave, and the reverse can also hold.

Which Value Is Subtracted The call subtracts the second measurement from the first. Enter the later measurement first if an increase should appear as a positive difference, and state the order of subtraction in the text.

IN R

How to Run the Paired Samples t-Test in R

The test itself is base R, and Pair() in a formula needs R 4.4.0 or later. Reshaping usually relies on tidyr and the effect size on an add-on, so record the versions of R and of each package with the script.

  1. Confirm the design: one continuous outcome measured twice on the same participants or on matched pairs.
  2. If the data are long, reshape to wide with pivot_wider() in tidyr and check that no ID repeats within a condition.
  3. Count the complete pairs with complete.cases() and plot the differences.
  4. Run the paired t.test in R with t.test(Pair(before, after) ~ 1, data = wide); the vector form t.test(before, after, paired = TRUE) also works.
  5. Read the mean difference, its 95 percent interval, t, df and the p-value together.
  6. Add a standardized effect for paired data with the effectsize package, checking the call form for your version, and save the script.

READING THE OUTPUT

What the Printed Block Shows About the Pairing

The block looks like the independent version, so the header and the degrees of freedom are the two lines that confirm the pairing worked as intended.

Output element What it tells you What to check
Header line Paired t-test, naming the test that ran That it does not read Welch Two Sample, which would mean the pairing was lost
data line The two measurements, or the Pair expression, that entered the call That the order is the one stated in the methods
t, df and p-value The statistic, df equal to the number of pairs minus 1, and the two-sided p That df plus 1 equals the number of complete pairs you expected
Alternative hypothesis A true mean difference not equal to 0, with wording that varies by version That a direction was not chosen after seeing the data
95 percent confidence interval The interval for the mean of the differences That its sign is read from the order of subtraction
Sample estimates The mean difference, labeled mean of the differences in older versions That it equals the first measurement minus the second, as a hand check
Effect size output A standardized paired effect, from an add-on package That the standardizer, the SD of differences or the average SD, is named

REPORTING

Reporting the Change With Its Interval

The order of subtraction decides how every number in this sentence reads, so it is stated once in words and kept consistent throughout.

Write t(df) = ___, p = ___, with df exactly as printed and the number of complete pairs. Report the mean difference with its 95% CI [___, ___] in the original units, and say in words which measurement was subtracted from which and whether scores rose or fell. Give the mean and standard deviation at each time point and the standard deviation of the differences. Add a standardized effect for paired data, for example Hedges’ g = ___ with its 95% CI [___, ___], and name the standardizer, since values differ by definition. Base R’s t.test prints no standardized effect size. State how many pairs were lost to missing values and whether their loss could relate to the outcome, and with no comparison group keep the wording to change, not to its cause.

Pairs CountedDirection in WordsMean Difference CIStandardizer NamedPairs Lost

COMMON MISTAKES

Pairing Errors That R Prints Without Complaint

Several of these are caught in the data frame and the reshaping step rather than in the result itself.

Long Data Not Aligned Two vectors taken from long data are paired by position. If the participants are in a different order in each condition, the pairs are wrong while R still prints a result.

Many Pairs of Time Points Running a separate paired test for each pair of three or more occasions multiplies the comparisons. A repeated measures model answers the question once, and any follow-up pairs are adjusted.

Duplicate IDs in the Reshape A participant ID that appears twice in one condition makes the reshaping warn or return list columns. Resolve duplicates from the design, not by dropping rows unseen.

Percent Change Swapped In Testing percent changes instead of raw differences answers a different question and becomes unstable when baseline values are near zero. The scale of the difference is chosen in advance and reported in those units.

Two Tests, One Comparison A significant change in one group and a non-significant one in another does not show that the groups differ. That question needs a model that tests the contrast between groups.

Cause Read From Change A before and after difference without a comparison group cannot separate the intervention from time, regression to the mean or repeated testing, so the wording stays with change.

Pairs formed by a reshaping step? Independent Statistical Review checks how the pairs were formed, the direction of the difference and the reported change before you submit.

Request an Assessment

FREQUENTLY ASKED QUESTIONS

Questions About Pairing in R

The first answer deals with a change in R itself, and the next two follow participants as their rows are rearranged into pairs.

From R 4.4.0 the formula method of t.test no longer accepts paired = TRUE, because pairing by row order inside a formula depended on sorting and subsetting. Use Pair(before, after) ~ 1 on wide data, or the vector form t.test(x, y, paired = TRUE). Check R.version.string, and confirm that the same rows are paired after the change.

Confirm that every participant ID has exactly one row per condition and that both conditions list participants in the same order. Tabulate the IDs with table(), sort by ID and condition before extracting the two vectors, or reshape to wide and count the complete pairs.

The pair is dropped, so the degrees of freedom rest on complete pairs only. Report how many pairs entered the test, and where baseline values exist, compare the dropped participants with those retained, because loss that depends on the outcome affects the average change.

Yes. An in-house PhD-level statistician can trace each participant from the long file to the wide one, confirm the order of subtraction and check the reported change, or run the analysis on your data. If the pairing is settled and the tables are what remain, Results Reporting & Interpretation is the natural fit. Conclusions about the change are yours to draw.

Your data and project details are handled confidentially, and project information is not published. Researcher names and institutions are not used publicly without permission. An NDA is available where required and can be arranged before sensitive materials are shared. Read more about confidentiality and data security.

You share your research question, design and relevant materials, such as the dataset or the output you have, and a statistically trained Research Coordinator reviews the request and responds the same day. The analysis, deliverables, timeline and one fixed project fee are then confirmed before any work begins, so the timeline follows from the agreed scope.

Still have a question? Find more answers in our full FAQ.

View All FAQs →

NEXT STEP

Are Your Pairs Built
the Way You Think?

Pairing errors leave no trace in the printed block, so the reshaping code deserves the same scrutiny as the result. A review of both can be scoped for your file, with no commitment required.

No Commitment Required

Strictly Confidential

Fixed Project Fee

In-House PhD-Level Statisticians

Same-Day Response

Serving Researchers Since 2014