2012-07-27 11 views
7

Ho la colonna come la seguente. Ogni colonna ha due coppie ciascuna con suffisso "a" e "b" - ad esempio col1a, col1b, colNa, colNb e così via fino alla fine del file (> 50000).unione (opposta della divisione) coppia di righe in r

mydataf <- data.frame (Ind = 1:5, col1a = sample (c(1:3), 5, replace = T), 
    col1b = sample (c(1:3), 5, replace = T), colNa = sample (c(1:3), 5, replace = T), 
    colNb = sample (c(1:3),5, replace = T), 
    K_a = sample (c("A", "B"),5, replace = T), 
    K_b = sample (c("A", "B"),5, replace = T)) 

mydataf 
    Ind col1a col1b colNa colNb K_a K_b 
1 1  1  1  2  3 B A 
2 2  1  3  2  2 B B 
3 3  2  1  1  1 B B 
4 4  3  1  1  3 A B 
5 5  1  1  3  2 B A 

Tranne prima colonna (Ind), voglio crollare la coppia di righe per rendere il look dataframe come il seguente, al Sametime il suffisso "a" e "b" essere rimosso. Anche fuse caratteri o numero da ordinare 1 prima che il 2, A prima di B

Ind col1 colN K_ 
    1 11  23 AB 
    2 13  22 BB 
    3 12  11 BB 
    4 13  13 AB 
    5 11  23 AB 

Edit: La funzione di grep (probabilmente) in risposta ha problema se il nome di colonne sono simili.

mydataf <- data.frame (col_1_a = sample (c(1:3), 5, replace = T), 
    col_1_b = sample (c(1:3), 5, replace = T), col_1_Na = sample (c(1:3), 5, replace = T), 
    col_1_Nb = sample (c(1:3),5, replace = T), 
    K_a = sample (c("A", "B"),5, replace = T), 
    K_b = sample (c("A", "B"),5, replace = T)) 
n <- names(mydataf) 
nm <- c(unique(substr(n, 1, nchar(n)-1))) 
df <- data.frame(sapply(nm, function(x){ 
          idx <- grep(x, n) 
          cols <- mydataf[idx] 
          x <- apply(cols, 1, 
             function(z) paste(sort(z), collapse = "")) 
          return(x) 
          })) 
names(df) <- nm 
df 

col_1_ col_1_N K_ 
1 2233  23 BB 
2 2233  22 BB 
3 1123  13 AB 
4 1223  12 AB 
5 2333  33 AB 

risposta

5
mydataf 
    Ind col1a col1b colNa colNb K_a K_b 
1 1  2  1  1  1 A A 
2 2  1  2  1  3 B A 
3 3  1  2  3  2 A A 
4 4  1  2  3  1 A B 
5 5  1  2  2  1 A A 
n <- names(mydataf) 
nm <- c("Ind", unique(substr(n, 1, nchar(n)-1)[-1])) 
df <- data.frame(sapply(nm, function(x){ 
          idx <- grep(paste0(x, "[ab]?$"), n) 
          cols <- mydataf[idx] 
          x <- apply(cols, 1, 
             function(z) paste(sort(z), collapse = "")) 
          return(x) 
          })) 
names(df) <- nm 
df 
    Ind col1 colN K_ 
1 1 12 11 AA 
2 2 12 13 AB 
3 3 12 23 AA 
4 4 12 13 AB 
5 5 12 12 AA 
+0

grazie per la soluzione, tuttavia la funzione, ma sembra che non v'è problema se il nome delle variabili sono simili vedere le modifiche recenti .. – shNIL

+0

@sharnil, ho sostituito 'x' con' paste0 (x, "[ab]? $") 'in' grep'. Ora richiederà che il nome della colonna termini con a o b, o con nessuno di essi (per il caso 'Ind'). Se non c'è alcuna colonna 'Ind' puoi rimuovere'? '. – Julius

Problemi correlati