2012-07-27 7 views
5

He problema siguiente, pude resolver:orden mientras división (. Ej TA debe dividirse a dos columnas "A" en la primera "T" segundo) en r

set.seed (1234) 
mydf <- data.frame (var1a = sample (c("TA", "AA", "TT"), 5, replace = TRUE), 
        varb2 = sample (c("GA", "AA", "GG"), 5, replace = TRUE), 
        varAB = sample (c("AC", "AA", "CC"), 5, replace = TRUE) 
        ) 
    mydf 

    var1a varb2 varAB 
1 TA AA CC 
2 AA GA AA 
3 AA GA AC 
4 AA AA CC 
5 TT AA AC 

que quieren dividir dos letras en una columna diferente, y luego ordenar alfabéticamente. Editar: El pedido se puede hacer antes de la división, por ejemplo var1a , "UN"). por lo que la clasificación está dentro de cada celda.

split_col <- function(.col, data){ 
    .x <- colsplit(data[[.col]], names = paste0(.col, letters[1:2])) 
    } 

dividida cada columna y combinar

require(reshape) 
    splitdf <- do.call(cbind, lapply(names(mydf), split_col, data = mydf)) 

var1aa var1ab varb2a varb2b varABa varABb 
1  T  A  A  A  C  C 
2  A  A  G  A  A  A 
3  A  A  G  A  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

Pero la parte sin resolver es que quiero pedir el par de columnas de tal manera que nombrecolumna "a" y columname "b" se ordenan por orden alfabético. Por lo tanto, la salida esperada:

var1aa var1ab varb2a varb2b varABa varABb 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

¿Cómo se puede pedir (corto con cada par de variables)?

+0

¿Quiere decir que cada fila de cada par de columnas debe ser ordenada alfabéticamente? Si ese es el caso, debe agregar esa declaración a su pregunta porque no está muy claro. – joran

+0

La pregunta tal como está es incoherente. El marco de datos creado por el código no coincide con el ejemplo que usted ofrece. Solo hay 2 'T' en los datos del código. Además, la naturaleza de la operación "ordenar alfabéticamente" no está clara. ¿Desea ordenar por la primera columna en orden reverese –

+0

Su función 'split_col' me da un error:' Error en is.character (patrón): 'patrón' falta' –

Respuesta

5
mylist <-as.list(mydf) 

splits <- lapply(mylist, reshape::colsplit, names=c("a", "b")) 
rowsort <- lapply(splits, function(x) t(apply(x, 1, sort))) 
comb <- do.call(data.frame, rowsort) 
comb 

    var1a.1 var1a.2 varb2.1 varb2.2 varAB.a varAB.b 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

EDIT: Si los nombres son importantes, puede reemplazarlos:

replaceNums <- function(x){ 
    .which <- regmatches(x, regexpr("[[:alnum:]]*(?=.)", x, perl=TRUE)) 
    stopifnot(length(x) %% 2 == 0) #checkstep 
    paste0(.which, c("a", "b")) 
} 

names(comb) <- replaceNums(names(comb)) 
comb 
    var1aa var1ab varb2a varb2b varABa varABb 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 
Cuestiones relacionadas