2012-04-27 12 views
5

Ecco piccolo esempio:Traduzione (ricodifica) errore di r

X1 <- c("AC", "AC", "AC", "CA", "TA", "AT", "CC", "CC") 
X2 <- c("AC", "AC", "AC", "CA", "AT", "CA", "AC", "TC") 
X3 <- c("AC", "AC", "AC", "AC", "AA", "AT", "CC", "CA") 
mydf1 <- data.frame(X1, X2, X3) 

ingresso frame di dati

X1 X2 X3 
1 AC AC AC 
2 AC AC AC 
3 AC AC AC 
4 CA CA AC 
5 TA AT AA 
6 AT CA AT 
7 CC AC CC 
8 CC TC CA 

La funzione

# Function 
atgc <- function(x) { 
xlate <- c("AA" = 11, "AC" = 12, "AG" = 13, "AT" = 14, 
"CA"= 12, "CC" = 22, "CG"= 23,"CT"= 24, 
"GA" = 13, "GC" = 23, "GG"= 33,"GT"= 34, 
"TA"= 14, "TC" = 24, "TG"= 34,"TT"=44, 
"ID"= 56, "DI"= 56, "DD"= 55, "II"= 66 
) 
    x = xlate[x] 
} 
outdataframe <- sapply (mydf1, atgc) 
outdataframe 
    X1 X2 X3 
AA 11 11 12 
AA 11 11 12 
AA 11 11 12 
AG 13 13 12 
CA 12 12 11 
AC 12 13 13 
AT 14 11 12 
AT 14 14 14 

problema, AC è non eaqual a 12 nel uscita piuttosto 11, in modo simile per gli altri. Solo pasticcio!

(Exta: Anche io non so come sbarazzarsi delle rownames.)

+2

La soluzione più semplice per voi potrebbe essere semplicemente modificare 'x = xlate [x]' in 'x = xlate [as.character (x)]', poiché questo è il bit che sta causando l'errore. (I 'x' sono vettori di classe 'factor', e i valori interi del fattore (piuttosto che le stringhe di caratteri associati) vengono utilizzati nell'indicizzazione.) –

+2

Inoltre, per sbarazzarsi dei nomi, basta fare' rownames (mydf) <- NULL'. –

risposta

4

Basta usare apply e trasporre:

t(apply (mydf1, 1, atgc)) 

Per utilizzare sapply, allora o l'uso:

  1. stringsAsFactors=FALSE durante la creazione del frame di dati, ovvero

    mydf1 <- data.frame(X1, X2, X3, stringsAsFactors=FALSE) 
    

    (@joran grazie) o

  2. Modificare l'ultima riga della funzione di: x = xlate[as.vector(x)]

+0

Penso che 'sapply' funzionerà se usano' stringsAsFactors = FALSE' per evitare i fattori, ma penso che sia probabilmente meglio. – joran

+0

@JohnCLK, Si potrebbe anche guardare la funzione 'recode' nel pacchetto' car', che fa ciò che penso si voglia fare con la funzione 'atgc'. – BenBarnes

1

La funzione `partita può usare argomenti fattore con un vettore di corrispondenza di destinazione che è "carattere" classe:

atgc <- function(fac){ c(11, 12, 13, 14, 
12, 22, 23, 24, 
13, 23, 33, 34, 
14, 24, 34,44, 
56, 56, 55, 66)[ 
match(fac, 
    c("AA", "AC", "AG", "AT", 
    "CA", "CC", "CG","CT", 
    "GA", "GC", "GG","GT" , 
    "TA", "TC", "TG","TT", 
    "ID", "DI", "DD", "II")) 
       ]} 
#The match function returns an index that is designed to pull from a vector. 
sapply(mydf1, atgc) 
    X1 X2 X3 
[1,] 12 12 12 
[2,] 12 12 12 
[3,] 12 12 12 
[4,] 12 12 12 
[5,] 14 14 11 
[6,] 14 12 14 
[7,] 22 12 22 
[8,] 22 24 12 
0

In questo modo, è necessario fornire solo valori di sostituzione per ogni singola lettera nella matrice, senza dover ricontrollare a m Assicurati di aver considerato tutte le combinazioni e di averle abbinate correttamente, sebbene con il tuo esempio le combinazioni siano limitate.

Definire elenco con i valori ei loro sostituto:

trans <- list(c("A","1"),c("C","2"),c("G","3"),c("T","4"), 
    c("I","6"),c("D","5")) 

Definire funzione di sostituzione utilizzando gsub()

atgc2 <- function(myData, x) gsub(x[1], x[2], myData) 

Creare un matrice con valori sostituiti (in questo caso, la conversione mydf1 ad una matrice restituito valori di carattere come desiderato per gsub(), ma si vorrebbe controllare se questo funziona con qualsiasi altro dato prima di procedere)

mymat <- Reduce(atgc2, trans, init = as.matrix(mydf1)) 

I valori mymat sono ancora nell'ordine in cui sono originariamente apparso, così "AC" = "12" e "CA" = "21", così riordinarle (e convertirli in valori numerici)

ansVec <- sapply(strsplit(mymat, split = ""), 
    function(x) as.numeric(paste0(sort(as.numeric(x)), collapse = ""))) 

L'oggetto ansVec è un vettore, quindi riconvertirlo in un dato.frame

(mydf2 <- data.frame(matrix(ansVec, nrow = nrow(mydf1)))) 
# X1 X2 X3 
# 1 12 12 12 
# 2 12 12 12 
# 3 12 12 12 
# 4 12 12 12 
# 5 14 14 11 
# 6 14 12 14 
# 7 22 12 22 
# 8 22 24 12 

Per questa situazione, le altre risposte sono decisamente più veloci. Tuttavia, poiché le operazioni di sostituzione diventano più complesse, ritengo che questa soluzione possa offrire alcuni vantaggi. Uno degli aspetti a cui questo metodo non si rivolgerebbe, tuttavia, sarebbe il controllo della stringa "ATTGCG" per entrambi "ATT" e "TTG".

0

In realtà, penso che tu voglia rappresentare i tuoi vettori originali come fattori, poiché rappresentano un insieme finito di livelli (DNA dinucleotidi) piuttosto che valori di caratteri arbitrari.

lvls = c("AA", "AC", "AG", "AT", "CA", "CC", "CG", "CT", "GA", "GC", 
     "GG", "GT", "TA", "TC", "TG", "TT", "ID", "DI", "DD", "II") 
X1 <- factor(c("AC", "AC", "AC", "CA", "TA", "AT", "CC", "CC"), levels=lvls) 
X2 <- factor(c("AC", "AC", "AC", "CA", "AT", "CA", "AC", "TC"), levels=lvls) 
X3 <- factor(c("AC", "AC", "AC", "AC", "AA", "AT", "CC", "CA"), levels=lvls) 
mydf1 <- data.frame(X1, X2, X3) 

Allo stesso modo, "11" è un livello di un fattore, e non il numero undici. Quindi una mappatura tra i livelli è

xlate <- c("AA" = "11", "AC" = "12", "AG" = "13", "AT" = "14", 
      "CA"= "12", "CC" = "22", "CG"= "23","CT"= "24", 
      "GA" = "13", "GC" = "23", "GG"= "33","GT"= "34", 
      "TA"= "14", "TC" = "24", "TG"= "34","TT"="44", 
      "ID"= "56", "DI"= "56", "DD"= "55", "II"= "66") 

e 'livellamento' una singola variabile

levels(X1) <- xlate 

di ri-livello tutte le colonne della cornice dati,

as.data.frame(lapply(mydf1, `levels<-`, xlate)) 

Uso sapply non è appropriato, perché crea una matrice (di carattere), anche se lo hai chiamato outdataframe. La distinzione potrebbe effettivamente essere importante per i dati SNP che questo potrebbe rappresentare, dal momento che milioni di SNP su 1000 di campioni come una matrice verrebbero implementati con un singolo vettore di lunghezza più lungo del vettore R più lungo possibile memorizzare (modulo di supporto vettoriale di grandi dimensioni introdotto in R-devel), mentre il data frame sarebbe un elenco di vettori di solo milioni di elementi ciascuno.

Problemi correlati