Повторите последовательность по группам - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий фрейм данных:

a <-  data.frame(
  group1=factor(rep(c("a","b"),each=6,times=1)),
  time=rep(1:6,each=1,times=2),
  newcolumn = c(1,1,2,2,3,3,1,1,2,2,3,3)
)

Я хочу скопировать вывод newcolumn с помощью функции rep by group (переменная time предназначена для упорядочивания). Другими словами, для каждой группы, упорядоченной по времени, как я могу назначить последовательность 1,1,2,2,n,n? Мне также нужно общее решение (в случае, если группы имеют разное количество строк, или я хочу повторить значения 3,10,n раз).

Например, я могу сгенерировать эту последовательность с помощью этого: newcolumn=rep(1:3,each=2,times=2)

Но это не сработает в выражении group by, где group1 имеет разные строки.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

A data.table альтернатива:

library(data.table)
DT <- as.data.table(a[1:2])

DT[order(time),newcolumn := rep(seq_len(.N/2), each=2, length.out=.N),by=c("group1")]
DT
#     group1 time newcolumn
#  1:      a    1         1
#  2:      a    2         1
#  3:      a    3         2
#  4:      a    4         2
#  5:      a    5         3
#  6:      a    6         3
#  7:      b    1         1
#  8:      b    2         1
#  9:      b    3         2
# 10:      b    4         2
# 11:      b    5         3
# 12:      b    6         3
0 голосов
/ 07 ноября 2018

Мы указываем length.out в rep после группировки по 'group1'

library(dplyr)
a %>% 
  group_by(group1) %>% 
  mutate(new = rep(seq_len(n()/2), each = 2, length.out = n()))

ПРИМЕЧАНИЕ. each и times не используются в одном вызове. Либо мы используем each или times

РЕДАКТИРОВАТЬ: на основе комментариев @ r2evans

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...