Преобразование длинного формата в широкий

Мой фрейм данных выглядит так:

 x <- data.frame(c("a","a","a","a","b","b","c","c","c","a", "a"), c(1,2,3,4,1,2,1,2,3, 1, 2))
names(x) <- c("id","nr") 

      id      nr
   1   a       1
   2   a       2
   3   a       3
   4   a       4
   5   b       1
   6   b       2
   7   c       1
   8   c       2
   9   c       3
   10  a       1
   11  a       2

Я хочу иметь что-то вроде этого:

  id   1  2  3  4
   a   1  2  3  4
   a   1  2  NA NA
   b   1  2  NA NA
   c   1  2  3  NA

Я уже использовал dcast(x, id ~ nr, value.var ="nr"), но получил предупреждение:

«Отсутствует функция агрегирования: по умолчанию используется длина».

Я понимаю, что это связано с неуникальными строками. Также я создал группы, которые дали мне результаты выше. Но есть ли способ создать его без создания групп?

x <- data.frame(c("a","a","a","a","b","b","c","c","c","a", "a"), 
c(1,1,1,1,1,1,1,1,1,2,2), c(1,2,3,4,1,2,1,2,3, 1, 2))
names(x) <- c("id", "group","nr")

dcast(x, id + group ~ nr, value.var = "nr")

person Dat Tran    schedule 07.05.2015    source источник
comment
Какой вопрос? Предупреждение возникает из-за того, что вы не указали аргумент fun.aggregate. .   -  person vagabond    schedule 07.05.2015
comment
о да, я вижу - для каждого значения id OP хочет новую строку для уникальных комбинаций значений NR ..   -  person vagabond    schedule 07.05.2015


Ответы (1)


Вам может понадобиться группирующая переменная. Вместо того, чтобы создавать его вручную, как показано в примере, мы можем использовать rleid, а затем попробовать dcast из разрабатываемой версии data.table. т.е. v1.9.5+. Инструкции по установке разрабатываемой версии: here

library(data.table)
dcast(setDT(x)[, gr:=rleid(id)], id+gr~nr, value.var='nr')[,gr:=NULL][]
#   id 1 2  3  4
#1:  a 1 2  3  4
#2:  a 1 2 NA NA
#3:  b 1 2 NA NA
#4:  c 1 2  3 NA

Или, как @Arun упомянул в комментариях, мы можем сделать это непосредственно в самом dcast

dcast(setDT(x), id + rleid(id) ~ nr, value.var = 'nr')[,id_1:= NULL]
person akrun    schedule 07.05.2015
comment
@Arun Спасибо, это более компактно и позволяет избежать создания / удаления столбца - person akrun; 08.05.2015