I have a dataframe df
, containing three vectors:
subject condition value
01 A 12
01 A 6
01 B 10
01
For each subject/condition pair create a sequence number seq
for its rows and then only keep those rows whose sequence number is less than 3.
subset(transform(DF, seq = ave(value, subject, condition, FUN = seq_along)), seq < 3)
giving:
subject condition value seq
1 01 A 12 1
2 01 A 6 2
3 01 B 10 1
4 01 B 2 2
5 02 A 5 1
6 02 A 11 2
7 02 B 3 1
8 02 B 5 2
The input in reprodudible form is assumed to be:
Lines <- "subject condition value
01 A 12
01 A 6
01 B 10
01 B 2
02 A 5
02 A 11
02 B 3
02 B 5
02 B 9"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE,
colClasses = c("character", "character", "numeric"))
Here's a dplyr
solution -
df %>%
group_by(subject, condition) %>%
filter(row_number() < 3) %>%
ungroup()
# A tibble: 8 x 3
subject condition value
<chr> <chr> <dbl>
1 01 A 12
2 01 A 6
3 01 B 10
4 01 B 2
5 02 A 5
6 02 A 11
7 02 B 3
8 02 B 5