Объединить data.frames с дубликатами - PullRequest
4 голосов
/ 26 марта 2012

У меня есть много data.frames, например:

df1 = data.frame(names=c('a','b','c','c','d'),data1=c(1,2,3,4,5))
df2 = data.frame(names=c('a','e','e','c','c','d'),data2=c(1,2,3,4,5,6))
df3 = data.frame(names=c('c','e'),data3=c(1,2))

, и мне нужно объединить эти data.frames, не удаляя дубликаты имени

> result
  names data1 data2 data3
1  'a'    1    1      NA
2  'b'    2    NA     NA
3  'c'    3    4      1
4  'c'    4    5      NA
5  'd'    5    6      NA
6  'e'    NA   2      2       
7  'e'    NA   3      NA

Я не могу найти функциюкак слияние с опцией для обработки дубликатов имен.Спасибо за помощь.Определить мою проблему.Данные получены из биологического эксперимента, где один образец имеет разное количество повторов.Мне нужно объединить весь эксперимент, и мне нужно подготовить эту таблицу.Я не могу сгенерировать уникальный идентификатор для дубликатов.

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

Сначала определите функцию run.seq, которая предоставляет порядковые номера для дубликатов, поскольку из выходных данных следует, что требуется, чтобы был связан i-й дубликат каждого имени в каждом компоненте слияния. Затем создайте список фреймов данных и добавьте столбец run.seq к каждому компоненту. Наконец, используйте Reduce, чтобы объединить их все.

run.seq <- function(x) as.numeric(ave(paste(x), x, FUN = seq_along))

L <- list(df1, df2, df3)
L2 <- lapply(L, function(x) cbind(x, run.seq = run.seq(x$names)))

out <- Reduce(function(...) merge(..., all = TRUE), L2)[-2]

Последняя строка дает:

> out
  names data1 data2 data3
1     a     1     1    NA
2     b     2    NA    NA
3     c     3     4     1
4     c     4     5    NA
5     d     5     6    NA
6     e    NA     2     2
7     e    NA     3    NA

РЕДАКТИРОВАТЬ: Исправлено run.seq, так что ввод не нужно сортировать.

1 голос
/ 26 марта 2012

См. Другие вопросы:

Примеры:

library(reshape)
out <- merge_recurse(L)

или

library(plyr)

out<-join(df1, df2, type="full")
out<-join(out, df3, type="full")
*can be looped

или

library(plyr)
out<-ldply(L)
0 голосов
/ 26 марта 2012

Я думаю, что в ваших примерах данных недостаточно данных для этого.Какой 'c' в кадре данных 1 должен быть связан с каким 'c' в кадре данных 2?Мы не можем сказать, поэтому R тоже не может.Я подозреваю, что вам придется добавить еще одну переменную для каждого из ваших фреймов данных, которая однозначно идентифицирует эти повторяющиеся случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...