【问题标题】:Compare split and merge two dataframe比较拆分和合并两个数据框
【发布时间】:2015-04-21 14:44:07
【问题描述】:

如何通过基因名称比较两个数据集df1和df2,并从df2中提取每个基因名称的对应值并将其插入df1

df1 <-

Genes    sample.ID  chrom   loc.start   loc.end num.mark
Klri2     LO.WGS      1   3010000 173490000     8430
Rrs1      LO.WGS      1   3010000 173490000     8430
Serpin    LO.WGS      1   3010000 173490000     8430
Myoc      LO.WGS          1   3010000 173490000     8430
St18      LO.WGS          1   3010000 173490000     8430


df2 <-

    RL  pValue.   chr   start            end    CNA     Genes
    2   2.594433   1    129740006   129780779   gain    Klri2   
    2   3.941399   1    130080653   130380997   gain    Serpin,St18,Myoc

df3<-

Genes   sample.ID  chrom  loc.start  loc.end num.mark   RL  pValue      CNA
Klri2    LO.WGS     1   3010000   173490000     8430    2   2.594433    gain
Rrs1     LO.WGS     1   3010000   173490000     8430    0     0          0
Serpin   LO.WGS     1   3010000   173490000     8430    2   3.941399    gain
Myoc     LO.WGS     1   3010000   173490000     8430    2   3.941399    gain
St18     LO.WGS     1   3010000   173490000     8430    2   3.941399    gain

【问题讨论】:

  • 这里是 dplyr 的精彩介绍。这是一个用于合并和选择 R 中特定列的包。它非常有用,值得一读。比这个具体问题更有价值。 link 如果仍然没有帮助,请回来询问具体问题,参考您的尝试和结果。

标签: r


【解决方案1】:

你可以试试:

library(splitstackshape)   
out <- cSplit(df2, "Genes", sep = ",", "long")

这将以正确的格式重塑df2(每个基因一行):

#   RL  pValue. chr     start       end  CNA  Genes
#1:  2 2.594433   1 129740006 129780779 gain  Klri2
#2:  2 3.941399   1 130080653 130380997 gain Serpin
#3:  2 3.941399   1 130080653 130380997 gain   St18
#4:  2 3.941399   1 130080653 130380997 gain   Myoc

那么你只需使用merge()left_join() from dplyr

library(dplyr)
df3 <- left_join(df1, out)

如果你想用0替换NAs,你可以这样做:

df3 <- left_join(df1, out) %>% mutate_each(funs(ifelse(is.na(.), 0, .)))

或者,如果您更喜欢子集:

df3 <- left_join(df1, out) %>% (function(x) { x[is.na(x)] <- 0; x })

【讨论】:

    【解决方案2】:

    这是一个合并操作,但首先您必须以正确的格式输入df2,其中每个基因包含一行(而不是多个基因用逗号分隔的单个条目)。 tidyr 包中有一个方便的函数,unnest()

    df2 <- tidyr::unnest(
             transform(df2, Genes = strsplit(as.character(df2$Genes), ",")),
             Genes)
    

    结果是这样的

    df2
    #  RL  pValue. chr     start       end  CNA  Genes
    #1  2 2.594433   1 129740006 129780779 gain  Klri2
    #2  2 3.941399   1 130080653 130380997 gain Serpin
    #3  2 3.941399   1 130080653 130380997 gain   St18
    #4  2 3.941399   1 130080653 130380997 gain   Myoc
    

    现在您可以简单地使用来自dplyrmerge(df1, df2, all.x = TRUE)left_join(或其他软件包,如data.table,取决于您想学习哪一个)。请注意,这将在您想要零的地方引入NAs,但您可以轻松地替换它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 2019-03-29
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多