【问题标题】:Merge two dataframes but mean columns that exists in both合并两个数据框,但意味着两者中都存在的列
【发布时间】:2018-12-20 13:32:19
【问题描述】:

假设我有两个 data.frames,

df = data.frame(gene = c("KRAS", "FOS"), A6 = c(20, 50), A7 = c(90, 80))
df2 = data.frame(gene = c("KRAS", "FOS"), A6 = c(20, 250) )

这里重复了A6,当我尝试使用merge(df, df2, by = "gene")合并这两个数据框时,它使用A6.xA6.y创建新列。

有没有办法让它合并,以便取而代之的是重复列的平均值?谢谢!

【问题讨论】:

    标签: r dplyr plyr reshape2


    【解决方案1】:

    mergeingsplit之后通过数字列名(子字符串)获取数据并得到rowMeans

    cbind(out[1], sapply(split.default(out[-1], 
              sub("\\..*", "", names(out)[-1])), rowMeans))
    #  gene  A6 A7
    #1  FOS 150 80
    #2 KRAS  20 90
    

    数据

    out <- merge (df, df2, by="gene")
    

    【讨论】:

    • 这是什么魔法?它有效,但不明白。当我尝试合并> 2个重复时,它甚至可以工作。谢谢。
    • @Ahdee 关键是将split 数据集根据列名的共性转换为data.frames 的list。在这里,我们用sub 删除了.x .y 部分,因此列名与拆分相同。然后,它只是循环遍历list(使用sapply)并获得行均值
    【解决方案2】:

    由于此示例中所需的 merge 没有向 df 添加任何新列,因此您可以使用 data.table 更新连接

    library(data.table)
    setDT(df)
    setDT(df2)
    
    df[df2, on = .(gene), A6 := (A6 + i.A6)/2]
    
    df
    #    gene  A6 A7
    # 1: KRAS  20 90
    # 2:  FOS 150 80
    

    这将修改df。如果你想要一个新的数据框,你可以使用copy

    copy(df)[df2, on = .(gene), A6 := (A6 + i.A6)/2]
    

    对于多个公共列

    no.avg <- 'gene'
    common <- intersect(names(df), names(df2))
    common <- setdiff(common, no.avg)
    
    df[df2, on = .(gene), 
       (common) := (get(common) + get(paste0('i.', common)))/2]
    

    【讨论】:

    • 不错!请问,如果有很多列重复,您如何处理?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多