【问题标题】:Merge data.frames with duplicates合并具有重复项的 data.frames
【发布时间】:2012-04-09 12:19:15
【问题描述】:

我有很多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

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

【问题讨论】:

    标签: r merge duplicates


    【解决方案1】:

    首先定义一个函数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 以便输入不需要排序。

    【讨论】:

    • 此解决方案仅适用于已排序的数据,但对我来说没问题。非常感谢你,你是最伟大的。对于这个例子: 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)) 它没有无需对名称进行排序即可工作。
    • 修改了run.seq,这样输入就不需要排序了。
    【解决方案2】:

    查看其他问题:

    例子:

    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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 数据框 1 中的哪个 'c' 应该与数据框 2 中的 'c' 配对并不重要(我认为,第一个免费的将是最好的,何时配对应创建新行)。我知道使用重复的标识符并不容易。
      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多