R: crear variables ficticias basadas en una variable categórica * de listas *

Tengo un marco de datos con una variable variable categóricaliza de cadenas, con longitud variable (es importante porque de lo contrario esta pregunta sería un duplicado deesta oesta), p.ej.:

df <- data.frame(x = 1:5)
df$y <- list("A", c("A", "B"), "C", c("B", "D", "C"), "E")
df
  x       y
1 1       A
2 2    A, B
3 3       C
4 4 B, D, C
5 5       E

Y la forma deseada es una variable ficticia para cada cadena única vista en cualquier lugar dedf$yes decir:

data.frame(x = 1:5, A = c(1,1,0,0,0), B = c(0,1,0,1,0), C = c(0,0,1,1,0), D = c(0,0,0,1,0), E = c(0,0,0,0,1))
  x A B C D E
1 1 1 0 0 0 0
2 2 1 1 0 0 0
3 3 0 0 1 0 0
4 4 0 1 1 1 0
5 5 0 0 0 0 1

Este enfoque ingenuo funciona:

> uniqueStrings <- unique(unlist(df$y))
> n <- ncol(df)
> for (i in 1:length(uniqueStrings)) {
+   df[,  n + i] <- sapply(df$y, function(x) ifelse(uniqueStrings[i] %in% x, 1, 0))
+   colnames(df)[n + i] <- uniqueStrings[i]
+ }

Sin embargo, es muy feo, vago y lento con grandes marcos de datos.

¿Alguna sugerencia? Algo elegante deltidyverse?

ACTUALIZACIÓN: Tengo 3 enfoques diferentes a continuación. Los probé usandosystem.time en mi computadora portátil (Windows 7, 32 GB de RAM) en unreal conjunto de datos, que consta de 1 millón de filas, cada fila contiene una lista de cadenas de 1 a 4 de longitud (de ~ 350 valores de cadena únicos), en general 200 MB en disco. Entonces, el resultado esperado es un marco de datos con dimensiones de 1M x 350. Eltidyverse (@Sotos) ybase (@ joel.wilson) los enfoques tardaron tanto que tuve que reiniciar R. ElqdapTools Sin embargo, el enfoque (@akrun) funcionó fantástico:

> system.time(res1 <- mtabulate(varsLists))
   user  system elapsed 
  47.05   10.27  116.82

Así que este es el enfoque que marcaré como aceptado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta