2
votes

Fusionner 2 tableaux de données selon une colonne légèrement différente

J'ai 2 tables de données et je souhaite les fusionner en fonction d'un chevauchement dans une colonne. Je pensais faire quelque chose comme

df_3

Cependant, j'ai un petit problème car la colonne avec laquelle je veux fusionner a un format légèrement différent.

head(df_1)

  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

head(df_2)

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_1 $ Loci Start et df_2 $ Start sont fondamentalement le même nombre, mais dans df_1 il y a des 0 commençant à 9 chiffres. Avez-vous des suggestions pour contourner ce problème?

Merci

r

3 commentaires

Quel est le type de données de Loci Start? S'il est numérique, les zéros non significatifs seront supprimés automatiquement.


génial!! Je ne savais pas ça. triés d'une manière vraiment simple! Merci beaucoup!


cela semble facile à résoudre avec des zéros non significatifs ... si ce n'est pas le cas, essayez les fonctions du fuzzyjoin -package


4 Réponses :


0
votes

vous pouvez utiliser str_pad du package stringr pour ajouter 0 sur le côté gauche de Start et le convertir en char, puis fusionner


0 commentaires

2
votes

Vous pouvez créer une colonne correspondante dans les deux ensembles de données contenant loci.start / start en tant que vecteur numérique; cela enlèvera les 0 en tête. Donc

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


0 commentaires

0
votes

Vous pouvez également faire (supprimer les zéros non significatifs):

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

Ensuite, faites fusionner:

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


0 commentaires

0
votes

Si vous vouliez pouvoir utiliser piping / tidyverse , vous pourriez faire quelque chose comme ceci.

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


0 commentaires