Tengo varios vectores (con nombre) en una lista:

data = list(a=runif(n = 50, min = 1, max = 10), b=runif(n = 50, min = 1, max = 10), c=runif(n = 50, min = 1, max = 10), d=runif(n = 50, min = 1, max = 10))

Quiero jugar con diferentes combinaciones de ellos dependiendo de la fila de otra matriz llamada peines:

 var <- letters[1:length(data)]
 combs <- do.call(expand.grid, lapply(var, function(x) c("", x)))[-1,]

Me gustaría poder extraer cada combinación para poder usar los vectores creados por estas combinaciones.
Todo esto es para poder aplicar funciones a cada fila extraída, y luego a cada combinación de estos marcos de datos. Así por ejemplo:

 # Row 5 is "a", "c"
 combs[5,] 
 # Use this information to extract this particular combination from my data:
 # by hand it would be:
 res_row5 = cbind(data[["a"]], data[["c"]])
 # Extract another combination
 # Row 11 is "a", "b", "d"
 combs[11,] 
 res_row11 = cbind(data[["a"]], data[["b"]], data[["d"]])
 # So that I can apply functions to each row across all these vectors
 res_row_5_func = apply(res_row5, 1, sum)
 # Apply another function to res_row11
 res_row_5_func = apply(res_row11, 1, prod)
 # Multiply the two, do other computations which can do as long as I have extracted the right vectors

Ya había hecho una pregunta muy similar aquí: ¿Hay una manera fácil de hacer coincidir los valores de una lista con la matriz en R?

Pero no puedo entender cómo extraer los datos reales ... ¡Muchas gracias!

0
user971102 24 mar. 2017 a las 07:10

2 respuestas

La mejor respuesta

Lo que podría hacer es generar primero una lista de vectores que indexen las entradas relevantes en data:

library(magrittr)
combList <- lapply(1:nrow(combs), function(ii) combs[ii,] %>% unlist %>% setdiff(""))

Luego puede usar esta lista para indexar las columnas en data y generar una nueva lista de las matrices deseadas:

dataMatrixList <- lapply(combList, function(indVec) data[indVec] %>% do.call('cbind', .)) 

La entrada i-ésima en su dataMatrixList contiene una matriz con columnas correspondientes a la fila i-ésima en combs. Luego puede calcular sumas, productos, etc. utilizando

rowSumsList <- lapply(dataMatrixList, function(x) apply(x, 1, sum))
1
ikop 24 mar. 2017 a las 08:45

Este sería otro enfoque, que creo que da lo que quieres. devolverá una lista de sus marcos de datos al subconjugar su lista de datos por los elementos (no vacíos) de cada fila de peines:

data_sets <- apply(combs,
    1, 
    function(x) do.call(cbind.data.frame, data[unlist(x[x!=''])])
    )
1
user7762777user7762777 24 mar. 2017 a las 14:32