Усечение кадра данных по количеству векторных элементов в R - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть фрейм данных df, содержащий три вектора:

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
...

Существует четыре наблюдения (и, следовательно, четыре строки) для субъекта 01, причем два наблюдения соответствуют condition A, а два - condition B. Допустим, из-за технической ошибки для субъекта 02 три condition B наблюдений.

У меня такой вопрос: как я могу усечь df, чтобы гарантировать, что каждое условие имеет только два наблюдения для каждого отдельного субъекта (следовательно, удаляя ошибочную третью строку, где condition==B для субъекта 02)?

Заранее благодарим за любую помощь!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вот решение dplyr -

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
0 голосов
/ 11 ноября 2018

Для каждой пары субъект / условие создайте порядковый номер seq для ее строк, а затем сохраняйте только те строки, чей порядковый номер меньше 3.

subset(transform(DF, seq = ave(value, subject, condition, FUN = seq_along)), seq < 3)

дает:

  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

Примечание

Предполагается, что входные данные в воспроизводимой форме:

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...