2012-03-25 2 views
3

У меня есть много data.frames, например:Объединить 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 

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

ответ

3

Сначала определите функцию, 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 

EDIT: Пересмотренный run.seq так, что вход не нужно быть отсортирован.

+0

Это решение работает правильно только для отсортированных данных, но это нормально для меня. Большое вам спасибо, вы величайший. Для этого примера: df1 = data.frame (names = c ('a', 'b', 'c', 'd', 'c', 'c'), data1 = c (1,2,3,4 , 5,6)) df2 = data.frame (names = c ('e', 'c', 'c', 'c'), data2 = c (1,2,3,4)), это не работайте без сортировки имен. – user1291855

+0

Исправлены 'run.seq', поэтому входные данные не нужно сортировать. –

0

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

+0

Это не важно, какой «с» в данном кадре 1 должны быть соединено с «с» из кадра данных 2 (я думаю, что первое свободное будет лучше, и когда все будут спарены, должна быть создана новая строка). Я знаю, что с повторяющимися идентификаторами это не так просто. – user1291855

Смежные вопросы