2012-03-25 82 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 

我不能找到像合并选项一样处理名称重复的功能。感谢您的帮助。 定义我的问题。数据来自生物实验,其中一个样品具有不同数量的重复。我需要合并所有实验,并且我需要生成此表。我无法为重复项生成唯一标识符。

回答

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 

编辑:修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 2012-03-26 07:50:52

+0

修改了'run.seq',以便输入不需要排序。 – 2012-03-26 11:40:51

0

我认为您的示例数据框中没有足够的信息来执行此操作。数据帧1中的哪个'c'应与数据帧2中的哪个'c'配对?我们不能说,所以R也不能。我怀疑你将不得不为每个数据框添加另一个变量来唯一标识这些重复的情况。

+0

它是“c”的数据帧1应与从数据帧2“c”的配对并不重要(我认为,第一自由将是最好的,并当所有将被配对时,应创建新的行)。我知道重复的标识符并不那么容易。 – user1291855 2012-03-25 22:56:22