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"