根据略有不同的列合并2个数据表

时间:2019-01-04 18:04:16

标签: r

我有2个数据表,我想根据列中的某些重叠将它们合并。我当时想做类似的事情

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

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

头(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

head(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位数字。您是否有解决此问题的建议?

谢谢

4 个答案:

答案 0 :(得分:2)

您可以在两个数据集中创建一个匹配列,其中包含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')

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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")

答案 3 :(得分:0)

如果您希望能够使用管道系统/ 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