【问题标题】:Merge 2 data table according to a slightly different column根据略有不同的列合并2个数据表
【发布时间】:2019-01-04 18:04:16
【问题描述】:

我有 2 个数据表,我想根据列中的一些重叠合并它们。我正在考虑做类似的事情

df_3

但是我有一个小问题,因为我要合并的列的格式略有不同。

头部(df_1)

Category Chromosome Loci Start  Loci End         Gene ID   Gene Symbol Strand Distance to TSS
1   Intron      chr10  047322187 047324337 ENST00000581492          GDF2      +             772
2    5'UTR      chr11  064210702 064211489 ENST00000541252        FERMT3      +            3278
3   Intron      chr11  128685393 128686512 ENST00000572256 RP11-744N12.3      -             476
4   Intron      chr11  128692708 128693199 ENST00000608303          FLI1      +            6418
5   Intron      chr12  005989201 005989836 ENST00000261405           VWF      -          135157
6   Intron      chr12  006036674 006037359 ENST00000261405           VWF      -           87659

头部(df_2)

  Chromosome     Start       End n_of_interactions stats
1      chr10  47322187  47324337                12  9.68
2      chr11  64210702  64211489                10  7.63
3      chr11 128685393 128686512                12  6.01
4      chr11 128692708 128693199                10  6.51
5      chr12   5989201   5989836                17  5.51
6      chr12   6036674   6037359                11  7.19

df_1$Loci Startdf_2$Start 基本上是相同的数字,但在df_1 中有起始0 到最多9 个数字。你有什么建议来解决这个问题吗?

谢谢

【问题讨论】:

  • Loci Start的数据类型是什么?如果它是数字,那么前导零将被自动删除。
  • 太棒了!我不知道。以非常简单的方式排序!非常感谢!
  • 这似乎很容易用前导零解决...如果不是这种情况,请尝试fuzzyjoin-package 中的功能

标签: r


【解决方案1】:

您可以在两个数据集中创建一个匹配列,其中包含 loci.start/start 作为数字向量;这将去掉前导的 0。所以

df_1$merge <- as.numeric(df_1$['Loci Start'])
df_2$merge <- as.numeric(df_2$Start)
df_3 <- merge(x = df_1, y = df_2, all = TRUE, by = 'merge')

【讨论】:

    【解决方案2】:

    您可以使用stringr包中的str_padStart左侧添加0并将其转换为char,然后合并

    【讨论】:

      【解决方案3】:

      您也可以这样做(删除前导零):

      df_1['Loci Start'] = gsub(pattern = '.*0', replacement = '', df_1['Loci Start'])
      

      然后,合并:

      df_3 <- merge(x = df_1, y = df_2, all = TRUE, by.x = "Loci Start", by.y = "Start")
      

      【讨论】:

        【解决方案4】:

        如果您希望能够使用管道/tidyverse,您可以这样做。

        library(tidyverse)
        
        df_1 %>%
         mutate(`Loci Start` = as.numeric(`Loci Start`)) %>%
         left_join(df_2, by = c("Loci Start" = "Start")) # change for the type of join you want
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-20
          • 2020-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多