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
4 Réponses :
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 p >
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')
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'])
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
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