Как переместить длинный кадр данных каждые n строк - PullRequest
0 голосов
/ 01 октября 2018

У меня есть такой фрейм данных:

x=data.frame(type = c('a','b','c','a','b','a','b','c'),
value=c(5,2,3,2,10,6,7,8))

каждый элемент имеет атрибуты a, b, c, в то время как в некоторых записях могут отсутствовать записи, т. Е. Только a и b

желаемый результат -

y=data.frame(item=c(1,2,3), a=c(5,2,6), b=c(2,10,7), c=c(3,NA,8))

Как я могу преобразовать x в y?Спасибо

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Создайте вектор группировки g, предполагая, что каждое вхождение a запускает новую группу, используйте tapply для создания таблицы tab и приведите ее к фрейму данных.Пакеты не используются.

g <- cumsum(x$type == "a")
tab <- with(x, tapply(value, list(g, type), c))
as.data.frame(tab)

, что дает:

  a  b  c
1 5  2  3
2 2 10 NA
3 6  7  8

Альтернативное определение вектора группировки, которое немного сложнее, но будет необходимо, если в некоторых группах отсутствует a.следующие.Предполагается, что x перечисляет значения type в порядке их уровней внутри группы, поэтому, если уровень меньше предыдущего уровня, он должен быть началом новой группы.

g <- cumsum(c(-1, diff(as.numeric(x$type))) < 0)

Примечаниечто в конечном итоге должно быть какое-то ограничение на отсутствие;в противном случае проблема неоднозначна.Например, если в одной группе могут отсутствовать b и c, а в следующей группе может отсутствовать a, тогда действительно ли b и c во второй группе образуют вторую группу или являются частью первой группыне определяется.

0 голосов
/ 01 октября 2018

Мы можем использовать dcast

library(data.table)
out <- dcast(setDT(x),  rowid(type) ~ type, value.var = 'value')
setnames(out, 'type', 'item')
out
#   item a  b  c
#1:    1 5  2  3
#2:    2 2 10  8
#3:    3 6  7 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...