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
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
@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