2017-06-27 1 views
2

J'ai une grande trame de données et je voudrais inverser les chaînes si elles ne sont pas les mêmes que la colonne ref, par exemple, je voudrais changer GA à AG et garder le reste comme elles sont.R inverser les chaînes dans une trame de données

structure(list(number = c("rs1", "rs2", "rs3", "rs4", "rs5", 
"rs6"), ref = c("AG", "AG", "AG", "AG", "AC", "AC"), s1 = c("GA", 
"AG", "GA", "AG", "CA", "AA"), s2 = c("AA", "GG", "GA", "AA", 
"AA", "AC"), s3 = c("GG", "AG", "GG", "AA", "CC", "AC"), s4 = c("GA", 
"GG", "GA", "AA", "AA", "CC"), s5 = c("AA", "GG", "GA", "GG", 
"AA", "CC"), s6 = c("AA", "AG", "GG", "AG", "AA", "CC")), .Names = 
c("number", 
"ref", "s1", "s2", "s3", "s4", "s5", "s6"), class = "data.frame", 
row.names = c(NA, 
-6L)) 

Input: 
number ref s1 s2 s3 s4 s5 s6 ... 
rs1 AG GA AA GG GA AA AA ... 
rs2 AG AG GG AG GG GG AG ... 
rs3 AG GA GA GG GA GA GG ... 
rs4 AG AG AA AA AA GG AG ... 
rs5 AC CA AA CC AA AA AA ... 
rs6 AC AA AC AC CC CC CC ... 

Desired output: 
number ref s1 s2 s3 s4 s5 s6 ... 
rs1 AG AG AA GG AG AA AA ... 
rs2 AG AG GG AG GG GG AG ... 
rs3 AG AG AG GG AG AG GG ... 
rs4 AG AG AA AA AA GG AG ... 
rs5 AC AC AA CC AA AA AA ... 
rs6 AC AA AC AC CC CC CC ... 

J'ai essayé d'utiliser la bibliothèque (Stingi) Fonction stri_reverse

df.1 <- c(df[1:2],sapply(df[3:length(df)], function(x) stri_reverse[[x]])) 

Erreur dans stri_reverse [[x]]: objet de type 'fermeture' ne subsettable

+0

'df [-c (1,2)] <- t (appliquer (df [-1], 1, fonction (x) remplacer (x [-1], x [1] == stri_reverse (x [-1]), x [1]))) ' –

Répondre

1

L'erreur vient du fait que vous essayez de sous-ensemble une fonction stri_reverse en utilisant [[ (probablement une faute de frappe?); En outre vous devez également ajuster votre logique un peu pour obtenir ce dont vous avez besoin:

library(stringi) 

df[-c(1,2)] <- lapply(df[-c(1,2)], function(col) { 
    rev_col = stri_reverse(col) 
    ifelse(rev_col == df$ref, rev_col, col) 
}) 

df 
# number ref s1 s2 s3 s4 s5 s6 
#1 rs1 AG AG AA GG AG AA AA 
#2 rs2 AG AG GG AG GG GG AG 
#3 rs3 AG AG AG GG AG AG GG 
#4 rs4 AG AG AA AA AA GG AG 
#5 rs5 AC AC AA CC AA AA AA 
#6 rs6 AC AA AC AC CC CC CC