vacio studio seleccionar repeticiones multiplicacion matrices listas ejemplos data crear contar columnas arrays r loops binary combinations

arrays - studio - R valores de relleno dependiendo de la combinación



multiplicacion de matrices en r (3)

Tengo una lista de varios (variables) número de letras en combinación, por ejemplo esto:

vec = c("a", "b", "c") comb = unlist(lapply(1:length(vec), combn, x = vec, simplify = FALSE), recursive = FALSE) # this creates all the combinations of the vector I am interested in, i.e. for three letters: # a b c ab ac bc abc

Para cada combinación, intento llenar los elementos que dependen de la posición, en vectores con la misma longitud que el número de vectores. Así que estoy tratando de obtener:

a = 200 b = 020 c = 002 ab = 220 ac = 202 bc = 022 abc = 222

En este momento estoy intentando con bucles que reemplazan cada elemento de una matriz i, j pero dado que todos los valores son "2", debe haber una forma más eficiente de hacerlo. ¡¡Muchas gracias!!


Aquí hay una opción diferente con factor

sapply(comb, function(x) paste(table(factor(x, levels = vec))*2, collapse="")) #[1] "200" "020" "002" "220" "202" "022" "222"

También podemos hacer uso del argumento FUN en combn

unlist(sapply(seq_along(vec), function(x) combn(vec, x, FUN = function(y) paste(table(factor(y, levels= vec))*2, collapse=''''))) ) #[1] "200" "020" "002" "220" "202" "022" "222"

O en una versión ligeramente compacta

unlist(lapply(seq_along(vec), function(x) combn(vec, x, FUN = function(y) paste((vec %in% y)*2, collapse="")) )) #[1] "200" "020" "002" "220" "202" "022" "222"


Comenzando desde vec , puedes hacer ...

comb_cases = do.call(expand.grid, lapply(vec, function(x) c("", x))) Var1 Var2 Var3 1 2 a 3 b 4 a b 5 c 6 a c 7 b c 8 a b c

Hay una fila en blanco para el conjunto vacío, como probablemente debería haber.

De aquí...

comb = do.call(paste0, comb_cases) # [1] "" "a" "b" "ab" "c" "ac" "bc" "abc" do.call(paste0, split( ifelse(nchar(as.matrix(comb_cases)), 2, 0), col(comb_cases)) ) # [1] "000" "200" "020" "220" "002" "202" "022" "222"

ifelse es lento, pero puede arreglarse más tarde si es importante.


Esto sigue siendo esencialmente un bucle, pero podría ser más fácil de entender:

sapply( lapply(comb, match, vec), function(x) paste(replace(numeric(3), x, 2), collapse="")) #[1] "200" "020" "002" "220" "202" "022" "222"