Я предоставлю альтернативу, используя data.table
, в случае, если ваше использование dcast
имеет смысл. В отличие от других ответов, мне интересно, намерены ли вы сделать это для презентации фактического резюме, поскольку между различными рейтингами нет явной контекстуальной корреляции.
library(data.table)
DT <- fread('rating title
5 Bean
5 Bean
4 Bean
5 Bean
5 Egg
4 Egg
3 Bacon
2 Bacon')
Сначала нам нужно назначить некоторый "id", который сохраняется в сводной таблице. Точно так же, поскольку это для представления (и мы, вероятно, хотим пробелы в неиспользуемых пробелах тис 0
или NA
), я преобразую
DT$rating <- as.character(DT$rating)
DT[, id := seq_len(.N), by="title"]
DT
# rating title id
# 1: 5 Bean 1
# 2: 5 Bean 2
# 3: 4 Bean 3
# 4: 5 Bean 4
# 5: 5 Egg 1
# 6: 4 Egg 2
# 7: 3 Bacon 1
# 8: 2 Bacon 2
dcast(DT, id ~ title, value.var = "rating", fill = "")[,id := NULL,][]
# Bacon Bean Egg
# 1: 3 5 5
# 2: 2 5 4
# 3: 4
# 4: 5
Обратите внимание, что это не предназначено для расчетов и анализа, просто для представления. Если вы хотите сохранить все числа, то в итоге вы получите
# starting with fresh `DT`, no as.character done
DT[, id := seq_len(.N), by="title"]
dcast(DT, id ~ title, value.var = "rating")[,id := NULL,][]
# Bacon Bean Egg
# 1: 3 5 5
# 2: 2 5 4
# 3: NA 4 NA
# 4: NA 5 NA
или при необходимости используйте dcast(..., fill=0)
для замены NA
с 0
с.
(В этом случае все еще не совсем ясно, как три значения в каждой отдельной строке связаны друг с другом, но, возможно, в ваших реальных данных / анализе есть смысл.)