El objetivo es crear indicadores para una variable de factor/cadena en un marco de datos. Ese dataframe tiene filas de> 2 mm y ejecuta R en Windows, no tengo la opción de usar plyr con .parallel = T. Así que estoy tomando la ruta "divide y vencerás" con plyr y reshape2.Generando indicadores en cuadros de datos grandes
Correr carreras de fusión y fundido fuera de la memoria, y el uso de
ddply(idata.frame(items) , c("ID") , function(x){
( colSums(model.matrix(~ x$element - 1)) > 0 )
} , .progress="text")
o
ddply(idata.frame(items) , c("ID") , function(x){
( elements %in% x$element )
} , .progress="text")
toma un tiempo. El enfoque más rápido es la llamada a tapply a continuación. ¿Ves una forma de acelerar esto? La instrucción% en% se ejecuta más rápido que la llamada model.matrix. Gracias.
set.seed(123)
dd <- data.frame(
id = sample(1:5, size=10 , replace=T) ,
prd = letters[sample(1:5, size=10 , replace=T)]
)
prds <- unique(dd$prd)
tapply(dd$prd , dd$id , function(x) prds %in% x)
Estoy confundido por su ejemplo. Estás dividiendo 'dd $ prd' por' dd $ id', luego preguntando qué valores de 'prds' están representados en cada id, pero' prds' no está ordenado (!) ¿Querías 'prds <- sort (unique (dd $ prd)) '(eso tendría mucho más sentido para mí ...)? –
Siempre que los indicadores (los lógicos) correspondientes a los elementos disponibles en los pds tengan el mismo orden en los ID, no importa cómo estén ordenados. –
OK. Ver mi otra pregunta, en mi respuesta a continuación ... –