Aquí hay un intento de hacer esto lo más vectorizado posible,
i1 <- names(unlist(l, TRUE, TRUE))
#[1] "a.a1" "a.a2" "a.a3" "a.b1" "a.b2" "a.b3" "a.c1" "a.c2" "a.c3" "b.a1" "b.a2" "b.a3" "b.b1" "b.b2" "b.b3" "b.c1" "b.c2" "b.c3" "c.a1" "c.a2" "c.a3" "c.b1" "c.b2" "c.b3" "c.c1" "c.c2" "c.c3"
i2 <- names(split(i1, gsub('\\d+', '', i1)))
#[1] "a.a" "a.b" "a.c" "b.a" "b.b" "b.c" "c.a" "c.b" "c.c"
Ahora podemos dividir i2todo antes del punto, lo que dará,
split(i2, sub('\\..*', '', i2))
# $a
# [1] "a.a" "a.b" "a.c"
# $b
# [1] "b.a" "b.b" "b.c"
# $c
# [1] "c.a" "c.b" "c.c"
Para que se limpien completamente, necesitamos recorrer y aplicar una expresión regular simple,
lapply(split(i2, sub('\\..*', '', i2)), function(i)sub('.*\\.', '', i))
lo que da,
$a
[1] "a" "b" "c"
$b
[1] "a" "b" "c"
$c
[1] "a" "b" "c"
El código compactado
i1 <- names(unlist(l, TRUE, TRUE))
i2 <- names(split(i1, gsub('\\d+', '', i1)))
final_res <- lapply(split(i2, sub('\\..*', '', i2)), function(i)sub('.*\\.', '', i))
unlist()al final, pero no estoy seguro de si esto es lo que desea.Primero cree l1, una lista anidada con solo los colnames
Entonces desliste l1
fuente
Aquí hay una manera de usar
purrrfuncionesmap_depthyvec_depthfuente