arrays - vacio - seleccionar columnas en r




R valores de relleno dependiendo de la combinación (2)

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.





combinations