質問: FALSE) #> letras_numeros letras numeros cores valor #> 1 a_1 a 1 branco 2 #> 2 a_1 a 1 preto 1 #> 3 a_2 a 2 branco 9 #> 4 a_2 a 2 preto 4 #> 5 a_3 a 3 branco 8 #> 6 a_3 a 3 preto 4 #> 7 a_4 a 4 branco 3 #> 8 a_4 a 4 preto 6 #> 9 b_1 b 1 branco 3 #> 10 b_1 b 1 preto 1 #> 11 b_2 b 2 branco 10 #> 12 b_2 b 2 preto 5 #> 13 b_3 b 3 branco 7 #> 14 b_3 b 3 preto 10 #> 15 b_4 b 4 branco 10 #> 16 b_4 b 4 preto 10 #> 17 c_1 c 1 branco 10 #> 18 c_1 c 1 preto 2 #> 19 c_2 c 2 branco 8 #> 20 c_2 c 2 preto 7 #> 21 c_3 c 3 branco 5 #> 22 c_3 c 3 preto 5 #> 23 c_4 c 4 branco 5 #> 24 c_4 c 4 preto 3 ``` De que maneira eu poderia automatizar este processo a fim de que todas as combinações entre duas e três colunas fossem criadas? Isto é, como obter ao final um data frame que possua as colunas `letras_numeros`, `letras_cores`, `numeros_cores`, `letras_numeros_cores`, `letras`, `numeros`, `cores` e `valor`?
回答: Esta solução R base não é uma função, mas dá uma ideia de como obter o resultado pretendido. Utiliza `combn` para aplicar `interaction` às combinações 2 as 2 das colunas `"letras"`, `"numeros"` e `"cores"`. Depois disso aplica a mesma função às três colunas. A seguir é só `cbind` os resultados. ``` fun <- function(x, envir = as.environment(dados)){ X <- mget(x, envir = envir) as.character(interaction(X, sep = "_")) } variaveis <- names(dados)[-4] fac1 <- combn(variaveis, 2, fun, simplify = FALSE) names(fac1) <- sapply(combn(variaveis, 2, simplify = FALSE), paste, collapse = "_") fac2 <- fun(variaveis) ``` Mas agora a coluna correspondente a `fac2` tem o nome errado: ``` names(res) #[1] "letras_numeros" "letras_cores" "numeros_cores" "fac2" "letras" "numeros" #[7] "cores" "valor" ``` Corrige-se isso e pronto. ``` names(res)[names(res) == "fac2"] <- paste(variaveis, collapse = "_") head(res) # letras_numeros letras_cores numeros_cores letras_numeros_cores letras numeros cores valor #1 a_1 a_branco 1_branco a_1_branco a 1 branco 2 #2 a_1 a_preto 1_preto a_1_preto a 1 preto 1 #3 a_2 a_branco 2_branco a_2_branco a 2 branco 9 #4 a_2 a_preto 2_preto a_2_preto a 2 preto 4 #5 a_3 a_branco 3_branco a_3_branco a 3 branco 8 #6 a_3 a_preto 3_preto a_3_preto a 3 preto 4 ``` Esta função é facilmente generalizável. E resolve-se automaticamente o problema da coluna com o nome errado, o nome certo também é atribuído dentro do ciclo `lapply`. ``` funCombinacoes <- function(data, vars, n){ fun <- function(x, envir = as.environment(data)){ X <- mget(x, envir = envir) as.character(interaction(X, sep = "_")) } res <- lapply(n, function(m){ fac1 <- combn(vars, m, fun, simplify = FALSE) names(fac1) <- sapply(combn(vars, m, simplify = FALSE), paste, collapse = "_") fac1 }) res <- do.call(cbind, unlist(res, recursive = FALSE)) cbind.data.frame(res, data) } res2 <- funCombinacoes(dados, variaveis, n = 2:3) identical(res, res2) #[1] TRUE ```