Remplacer la liste des caractères par une séquence de flottants basée sur la trame de données de mappage

Aug 19 2020

J'ai une trame de données de cartographie et une grande trame de données où chaque ligne représente une protéine avec sa séquence.

Je veux un moyen efficace de mapper les séquences aux valeurs correspondant à l'acide aminé en fonction de la trame de données de cartographie.

J'ai pu parcourir la séquence et la remplacer par le code suivant :

calcStickiness <- function(seq) {
  seq_iter <- strsplit(unlist(seq), "")[[1]]
  transformed_seq <- c()
  for (c in seq_iter) {
    transformed_seq <- c(transformed_seq, stickiness_tabel[stickiness_tabel["X"] == c][2])
  }
  print(transformed_seq)
}
# calling the function
calcStickiness(row["sequence_full"][1])

stickiness_tabelest :

structure(list(X = c("K", "E", "D", "N", "Q", "S", "P", "R", 
"T", "H", "A", "G", "M", "V", "L", "I", "F", "C", "Y", "W"), 
    x = c(-1.25639466063649, -0.928687786101206, -0.700106643211895, 
    -0.356971499674196, -0.295054350932285, -0.209468209138379, 
    -0.177787659972006, -0.0892949396458573, 0.0576667944592403, 
    0.215277407729333, 0.263739398989502, 0.556792734365241, 
    0.7448899445842, 0.900506232741908, 1.06680680601946, 1.18416532767113, 
    1.68723510186035, 1.70109173545121, 1.70150269278206, 2.01452547017961
    )), class = "data.frame", row.names = c(NA, -20L))

Je voulais savoir s'il existe un moyen plus rapide de le faire car la trame de données de ma séquence contient de nombreuses entrées.

Une ligne simple de la trame de données est :

structure(list(X = 1L, code = "12as_1", nsub2 = 2L, pdb_error2 = "NO", 
    QSBIO_err_prob = 3.5, chain_name = "B", sequence_full = "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQTLGQHDFSAGEGLYTHMKALRPDEDRLSPLHSVYVDQWDWERVMGDGERQFSTLKSTVEAIWAGIKATEAAVSEEFGLAPFLPDQIHFVHSQELLSRYPDLDAKGRERAIAKDLGAVFLVGIGGKLSDGHRHDVRAPDYDDWSTPSELGHAGLNGDILVWNPVLEDAFELSSMGIRVDADTLKHQLALTGDEDRLELEWHQALLRGEMPQTIGGGIGQSRLTMLLLQLPHIGQVQAGVWPAAVRESVPSLL"), row.names = 1L, class = "data.frame")

Où je suis intéressé sequence_full.

Éditer

pour la ligne suivante :

MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQTLGQHDFSAGEGLYTHMKALRPDEDRLSPLHSVYVDQWDWERVMGDGERQFSTLKSTVEAIWAGIKATEAAVSEEFGLAPFLPDQIHFVHSQELLSRYPDLDAKGRERAIAKDLGAVFLVGIGGKLSDGHRHDVRAPDYDDWSTPSELGHAGLNGDILVWNPVLEDAFELSSMGIRVDADTLKHQLALTGDEDRLELEWHQALLRGEMPQTIGGGIGQSRLTMLLLQLPHIGQVQAGVWPAAVRESVPSLL

Je veux obtenir quelque chose comme :

[1] " 0.74488994" "-1.25639466" " 0.05766679" " 0.26373940" " 1.70150269" " 1.18416533" " 0.26373940" "-1.25639466" "-0.29505435"
 [10] "-0.08929494" "-0.29505435" " 1.18416533" "-0.20946821" " 1.68723510" " 0.90050623" "-1.25639466" "-0.20946821" " 0.21527741"
 [19] " 1.68723510" "-0.20946821" "-0.08929494" "-0.29505435" " 1.06680681" "-0.92868779" "-0.92868779" "-0.08929494" " 1.06680681"
 [28] " 0.55679273" " 1.06680681" " 1.18416533" "-0.92868779" " 0.90050623" "-0.29505435" " 0.26373940" "-0.17778766" " 1.18416533"
 [37] " 1.06680681" "-0.20946821" "-0.08929494" " 0.90050623" " 0.55679273" "-0.70010664" " 0.55679273" " 0.05766679" "-0.29505435"
 [46] "-0.70010664" "-0.35697150" " 1.06680681" "-0.20946821" " 0.55679273" " 0.26373940" "-0.92868779" "-1.25639466" " 0.26373940"
 [55] " 0.90050623" "-0.29505435" " 0.90050623" "-1.25639466" " 0.90050623" "-1.25639466" " 0.26373940" " 1.06680681" "-0.17778766"
 [64] "-0.70010664" " 0.26373940" "-0.29505435" " 1.68723510" "-0.92868779" " 0.90050623" " 0.90050623" " 0.21527741" "-0.20946821"
 [73] " 1.06680681" " 0.26373940" "-1.25639466" " 2.01452547" "-1.25639466" "-0.08929494" "-0.29505435" " 0.05766679" " 1.06680681"
 [82] " 0.55679273" "-0.29505435" " 0.21527741" "-0.70010664" " 1.68723510" "-0.20946821" " 0.26373940" " 0.55679273" "-0.92868779"
 [91] " 0.55679273" " 1.06680681" " 1.70150269" " 0.05766679" " 0.21527741" " 0.74488994" "-1.25639466" " 0.26373940" " 1.06680681"
[100] "-0.08929494" "-0.17778766" "-0.70010664" "-0.92868779" "-0.70010664" "-0.08929494" " 1.06680681" "-0.20946821" "-0.17778766"
[109] " 1.06680681" " 0.21527741" "-0.20946821" " 0.90050623" " 1.70150269" " 0.90050623" "-0.70010664" "-0.29505435" " 2.01452547"
[118] "-0.70010664" " 2.01452547" "-0.92868779" "-0.08929494" " 0.90050623" " 0.74488994" " 0.55679273" "-0.70010664" " 0.55679273"
[127] "-0.92868779" "-0.08929494" "-0.29505435" " 1.68723510" "-0.20946821" " 0.05766679" " 1.06680681" "-1.25639466" "-0.20946821"
[136] " 0.05766679" " 0.90050623" "-0.92868779" " 0.26373940" " 1.18416533" " 2.01452547" " 0.26373940" " 0.55679273" " 1.18416533"
[145] "-1.25639466" " 0.26373940" " 0.05766679" "-0.92868779" " 0.26373940" " 0.26373940" " 0.90050623" "-0.20946821" "-0.92868779"
[154] "-0.92868779" " 1.68723510" " 0.55679273" " 1.06680681" " 0.26373940" "-0.17778766" " 1.68723510" " 1.06680681" "-0.17778766"
[163] "-0.70010664" "-0.29505435" " 1.18416533" " 0.21527741" " 1.68723510" " 0.90050623" " 0.21527741" "-0.20946821" "-0.29505435"
[172] "-0.92868779" " 1.06680681" " 1.06680681" "-0.20946821" "-0.08929494" " 1.70150269" "-0.17778766" "-0.70010664" " 1.06680681"
[181] "-0.70010664" " 0.26373940" "-1.25639466" " 0.55679273" "-0.08929494" "-0.92868779" "-0.08929494" " 0.26373940" " 1.18416533"
[190] " 0.26373940" "-1.25639466" "-0.70010664" " 1.06680681" " 0.55679273" " 0.26373940" " 0.90050623" " 1.68723510" " 1.06680681"
[199] " 0.90050623" " 0.55679273" " 1.18416533" " 0.55679273" " 0.55679273" "-1.25639466" " 1.06680681" "-0.20946821" "-0.70010664"
[208] " 0.55679273" " 0.21527741" "-0.08929494" " 0.21527741" "-0.70010664" " 0.90050623" "-0.08929494" " 0.26373940" "-0.17778766"
[217] "-0.70010664" " 1.70150269" "-0.70010664" "-0.70010664" " 2.01452547" "-0.20946821" " 0.05766679" "-0.17778766" "-0.20946821"
[226] "-0.92868779" " 1.06680681" " 0.55679273" " 0.21527741" " 0.26373940" " 0.55679273" " 1.06680681" "-0.35697150" " 0.55679273"
[235] "-0.70010664" " 1.18416533" " 1.06680681" " 0.90050623" " 2.01452547" "-0.35697150" "-0.17778766" " 0.90050623" " 1.06680681"
[244] "-0.92868779" "-0.70010664" " 0.26373940" " 1.68723510" "-0.92868779" " 1.06680681" "-0.20946821" "-0.20946821" " 0.74488994"
[253] " 0.55679273" " 1.18416533" "-0.08929494" " 0.90050623" "-0.70010664" " 0.26373940" "-0.70010664" " 0.05766679" " 1.06680681"
[262] "-1.25639466" " 0.21527741" "-0.29505435" " 1.06680681" " 0.26373940" " 1.06680681" " 0.05766679" " 0.55679273" "-0.70010664"
[271] "-0.92868779" "-0.70010664" "-0.08929494" " 1.06680681" "-0.92868779" " 1.06680681" "-0.92868779" " 2.01452547" " 0.21527741"
[280] "-0.29505435" " 0.26373940" " 1.06680681" " 1.06680681" "-0.08929494" " 0.55679273" "-0.92868779" " 0.74488994" "-0.17778766"
[289] "-0.29505435" " 0.05766679" " 1.18416533" " 0.55679273" " 0.55679273" " 0.55679273" " 1.18416533" " 0.55679273" "-0.29505435"
[298] "-0.20946821" "-0.08929494" " 1.06680681" " 0.05766679" " 0.74488994" " 1.06680681" " 1.06680681" " 1.06680681" "-0.29505435"
[307] " 1.06680681" "-0.17778766" " 0.21527741" " 1.18416533" " 0.55679273" "-0.29505435" " 0.90050623" "-0.29505435" " 0.26373940"
[316] " 0.55679273" " 0.90050623" " 2.01452547" "-0.17778766" " 0.26373940" " 0.26373940" " 0.90050623" "-0.08929494" "-0.92868779"
[325] "-0.20946821" " 0.90050623" "-0.17778766" "-0.20946821" " 1.06680681" " 1.06680681"

La sortie doit ensuite être exportée vers un fichier.

Réponses

1 Edo Aug 19 2020 at 17:31

J'ai appelé les données de la même manière que vous:


stickiness_tabel <- structure(list(X = c("K", "E", "D", "N", "Q", "S", "P", "R", 
                                         "T", "H", "A", "G", "M", "V", "L", "I", "F", "C", "Y", "W"), 
                             x = c(-1.25639466063649, -0.928687786101206, -0.700106643211895, 
                                        -0.356971499674196, -0.295054350932285, -0.209468209138379, 
                                        -0.177787659972006, -0.0892949396458573, 0.0576667944592403, 
                                        0.215277407729333, 0.263739398989502, 0.556792734365241, 
                                        0.7448899445842, 0.900506232741908, 1.06680680601946, 1.18416532767113, 
                                        1.68723510186035, 1.70109173545121, 1.70150269278206, 2.01452547017961
                             )), class = "data.frame", row.names = c(NA, -20L))

row <- structure(list(X = 1L, code = "12as_1", nsub2 = 2L, pdb_error2 = "NO", 
                             QSBIO_err_prob = 3.5, chain_name = "B", sequence_full = "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSGAEKAVQVKVKALPDAQFEVVHSLAKWKRQTLGQHDFSAGEGLYTHMKALRPDEDRLSPLHSVYVDQWDWERVMGDGERQFSTLKSTVEAIWAGIKATEAAVSEEFGLAPFLPDQIHFVHSQELLSRYPDLDAKGRERAIAKDLGAVFLVGIGGKLSDGHRHDVRAPDYDDWSTPSELGHAGLNGDILVWNPVLEDAFELSSMGIRVDADTLKHQLALTGDEDRLELEWHQALLRGEMPQTIGGGIGQSRLTMLLLQLPHIGQVQAGVWPAAVRESVPSLL"), row.names = 1L, class = "data.frame")

Maintenant, ce que vous pourriez faire est ceci :

stickiness <- setNames(stickiness_tabel$x, stickiness_tabel$X)
lapply(strsplit(row$sequence_full, split = ""), function(x) stickiness[x])

Il renvoie une liste de vecteurs numériques. Chaque élément de la liste correspond à la ligne que vous avez convertie et chaque vecteur est un vecteur nommé de niveaux d'adhérence nommés par la lettre correspondante.

Est-ce la sortie que vous attendiez ? Parce que ce n'est pas clair pour moi d'après votre question.

1 Humpelstielzchen Aug 19 2020 at 18:10

Peut-être qu'une data.tablesolution conviendra à vos besoins.

J'ai créé un exemple d'ensemble de données de 1000 lignes en répétant la ligne que vous avez fournie.


library(data.table)

df <- row[rep(1, 1000),] #repeat row
df_dt <- setDT(df) # convert to data.table

value <- setNames(stickiness_tabel$x, stickiness_tabel$X)


start <- Sys.time()

df_dt[, sequence_full := lapply(sequence_full, function(x) value[unlist(strsplit(x, split = ""))])]

end <- Sys.time()
end - start

Time difference of 0.03744602 secs


df_dt[1, sequence_full]

[[1]]
          M           K           T           A           Y           I           A           K           Q 
 0.74488994 -1.25639466  0.05766679  0.26373940  1.70150269  1.18416533  0.26373940 -1.25639466 -0.29505435 
          R           Q           I           S           F           V           K           S           H 
-0.08929494 -0.29505435  1.18416533 -0.20946821  1.68723510  0.90050623 -1.25639466 -0.20946821  0.21527741 
          F           S           R           Q           L           E           E           R           L 
 1.68723510 -0.20946821 -0.08929494 -0.29505435  1.06680681 -0.92868779 -0.92868779 -0.08929494  1.06680681 
          G           L           I           E           V           Q           A           P           I 
 0.55679273  1.06680681  1.18416533 -0.92868779  0.90050623 -0.29505435  0.26373940 -0.17778766  1.18416533 ...

Il transforme votre table d'adhérence en un vecteur et l'indexe pour chacun sequence_fulldans chaque ligne.

Pour le sortir, vous pouvez faire:

write.csv(stack(unlist(df_dt[1, sequence_full])), file = "~/sequence_output.csv", row.names = F)

Qui renvoie un csv avec une colonne avec la valeur d'adhérence et l'autre avec l'élément de séquence.