Пометить последовательные прогоны последовательности в столбце последовательными буквами - PullRequest
2 голосов
/ 18 апреля 2019

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

df <- data.frame(week = rep(seq(1, 4, by=1), times = 3) )

   week
1     1
2     2
3     3
4     4
5     1
6     2
7     3
8     4
9     1
10    2
11    3
12    4

Я хочу пометить каждую последующую серию 1: 4 буквой, чтобы получить следующий результат:

   week episode
1     1       a
2     2       a
3     3       a
4     4       a
5     1       b
6     2       b
7     3       b
8     4       b
9     1       c
10    2       c
11    3       c
12    4       c

Я пробовал следующее, но это не различает отдельные последовательные прогоны последовательности 1: 4

data.frame(df, episode = letters[cumsum(c(1L, diff(df$week) > 1L))]) 
   week episode
1     1       a
2     2       a
3     3       a
4     4       a
5     1       a
6     2       a
7     3       a
8     4       a
9     1       a
10    2       a
11    3       a
12    4       a

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Другая возможность dplyr может быть:

df %>%
 mutate(episode = letters[gl(n()/4, 4)])

   week episode
1     1       a
2     2       a
3     3       a
4     4       a
5     1       b
6     2       b
7     3       b
8     4       b
9     1       c
10    2       c
11    3       c
12    4       c

Или то же самое с base R:

df$episode = letters[gl(length(df$week)/4, 4)]

Или:

df %>%
 mutate(episode = letters[ceiling(seq_along(week)/4)])

Илито же самое с base R:

df$episode = letters[ceiling(seq_along(df$week)/4)]
1 голос
/ 18 апреля 2019

Вы можете использовать rowid из пакета data.table

library(data.table)
setDT(df)

df[, episode := letters[rowid(week)]]

#     week episode
#  1:    1       a
#  2:    2       a
#  3:    3       a
#  4:    4       a
#  5:    1       b
#  6:    2       b
#  7:    3       b
#  8:    4       b
#  9:    1       c
# 10:    2       c
# 11:    3       c
# 12:    4       c
1 голос
/ 18 апреля 2019

Если он уже находится в последовательности, просто выполните накопление логического вектора (week == 1)

library(dplyr)
df %>% 
    mutate(episode =  letters[cumsum(week == 1)])
#   week episode
#1     1       a
#2     2       a
#3     3       a
#4     4       a
#5     1       b
#6     2       b
#7     3       b
#8     4       b
#9     1       c
#10    2       c
#11    3       c
#12    4       c

Или используйте base R (без каких-либо дополнительных пакетов)

df$episode <- letters[cumsum(df$week == 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...