Извлечение повторяющихся строк из фрейма данных - PullRequest
4 голосов
/ 19 октября 2011

У меня большой фрейм данных, с которым я работаю, первые несколько строк выглядят следующим образом:

      Assay   Genotype   Sample    Result
1     001        G         1         0
2     001        A         2         1
3     001        G         3         0 
4     001        NA        1         NA
5     002        T         1         0
6     002        G         2         1
7     002        T         2         0 
8     002        T         4         0
9     003        NA        1         NA

В общей сложности я буду работать с 2000 выборками и 168 анализами для каждой выборки.

Я хотел бы извлечь строки, в которых у меня есть несколько записей с одинаковыми Assay и Sample.Я хочу, чтобы полученные данные находились во фрейме данных, содержащем все дублирующиеся записи, отсортированные так, чтобы дубликаты были рядом друг с другом.Из приведенного выше примера результат будет выглядеть так:

      Assay   Genotype   Sample    Result
1     001        G         1         0
4     001        NA        1         NA
6     002        G         2         1
7     002        T         2         0 

1 Ответ

5 голосов
/ 19 октября 2011

Демонстрационные данные для легкой загрузки:

df <- structure(list(Assay = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L), Genotype = structure(c(2L, 1L, 2L, NA, 3L, 2L, 3L, 3L, NA), .Label = c("A", "G", "T"), class = "factor"), Sample = c(1L, 2L, 3L, 1L, 1L, 2L, 2L, 4L, 1L), Result = c(0L, 1L, 0L, NA, 0L, 1L, 0L, 0L, NA)), .Names = c("Assay", "Genotype", "Sample", "Result"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9"))

Вы можете легко получить дублированные пары Assay / Sample с duplicated:

vars <- c('Assay', 'Sample')
dup <- df[duplicated(x[, vars]), vars]

В результате:

> dup
  Assay Sample
4     1      1
7     2      2

Для которого требуется простой merge для требуемого результата:

> merge(dup, df)
  Assay Sample Genotype Result
1     1      1     <NA>     NA
2     1      1        G      0
3     2      2        G      1
4     2      2        T      0
...