Как насчет расщепления и рекомбинации:
wide.df <- Reduce(cbind, split(df, cumsum( rep(c(1,0,0), nrow(df)/3) ) )
Это будет иметь преимущество перед приведением к матрице и обратным приведением к информационному фрейму, так как оно не будет иметь никаких проблем с факторами или символами, которые портят классы. Использование матрицы в качестве промежуточного звена сначала потеряло бы все уровни, и если бы у вас были и персонажи, и факторы, у вас был бы действительно запутанный беспорядок.
Возможно, вам придется немного поиграть с именами столбцов, если вам нужен точный результат, и я был бы рад помочь в этом, если вы разместили копируемую [MCVE]