2012-07-27 8 views
7

Mam kolumnę jak poniżej. Każda kolumna ma dwie pary każda z sufiksem "a" i "b" - na przykład col1a, col1b, colNa, colNb i tak dalej do końca pliku (> 50000).Scal (przeciwieństwo podziału) para wierszy 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 

wyjątkiem pierwszej kolumnie (Ind), to mają być zwijane parę rzędów, aby wygląd dataframe w następujący sposób, na Sametime przyrostek „a” i „b” są usunięte. Również połączone znaków lub numer zamawiać 1 pierwszy 2, pierwszy niż 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: Funkcja grep (prawdopodobnie) w odpowiedzi ma problemu, jeśli nazwa kolumny są podobne.

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 

Odpowiedz

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

dziękuję za rozwiązanie, jednakże funkcję, jednak wygląda na to, nie ma problemu, jeśli nazwa zmiennych są podobne patrz niedawne zmiany .. – shNIL

+0

@sharnil, Wymieniłem 'x' z' paste0 (x, "[ab]? $") 'in 'grep'. Teraz będzie wymagać, aby nazwa kolumny kończyła się na a lub b, lub na żadnej z nich (w przypadku "Ind"). Jeśli nie ma kolumny "Ind", możesz usunąć '?'. – Julius