Как создать столбец последовательности для повторяющихся значений? - PullRequest
3 голосов
/ 06 апреля 2020

У меня есть df, который создается примерно так:

ID <- c(1, 2, 3, 4)
count <- c(2, 4, 6, 10)
data <- data.frame(ID, count)
data <- data[rep(1:nrow(data), data$count),]
print(data)

Я хочу иметь другой столбец, который по сути печатает последовательность подсчета? Я не уверен, как лучше описать то, что я получаю в основном, я хочу, чтобы это выглядело следующим образом:

    ID count sequence
1    1     2        1
1.1  1     2        2
2    2     4        1
2.1  2     4        2
2.2  2     4        3
2.3  2     4        4
3    3     6        1
3.1  3     6        2
3.2  3     6        3
3.3  3     6        4
3.4  3     6        5
3.5  3     6        6
4    4    10        1
4.1  4    10        2
4.2  4    10        3
4.3  4    10        4
4.4  4    10        5
4.5  4    10        6
4.6  4    10        7
4.7  4    10        8
4.8  4    10        9
4.9  4    10       10

Спасибо

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020
data$sequence <- unlist(lapply( with(data, rle(count)$lengths), seq_len))
data
   ID count sequence
1    1     2        1
1.1  1     2        2
2    2     4        1
2.1  2     4        2
2.2  2     4        3
2.3  2     4        4
3    3     6        1
3.1  3     6        2
3.2  3     6        3
3.3  3     6        4
3.4  3     6        5
3.5  3     6        6
4    4    10        1
4.1  4    10        2
4.2  4    10        3
4.3  4    10        4
4.4  4    10        5
4.5  4    10        6
4.6  4    10        7
4.7  4    10        8
4.8  4    10        9
4.9  4    10       10
2 голосов
/ 06 апреля 2020

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

library(dplyr)
library(data.table)
data %>% 
    mutate(sequence = rowid(ID))
#     ID count sequence
#1    1     2        1
#1.1  1     2        2
#2    2     4        1
#2.1  2     4        2
#2.2  2     4        3
#2.3  2     4        4
#3    3     6        1
#3.1  3     6        2
#3.2  3     6        3
#3.3  3     6        4
#3.4  3     6        5
#3.5  3     6        6
#4    4    10        1
#4.1  4    10        2
#4.2  4    10        3
#4.3  4    10        4
#4.4  4    10        5
#4.5  4    10        6
#4.6  4    10        7
#4.7  4    10        8
#4.8  4    10        9
#4.9  4    10       10

Если он основан на столбце 'count'

data %>%
     mutate(sequence = rowid(count))

Или использовать ave из base R

data$sequence <- with(data, ave(seq_along(ID), ID, FUN = seq_along))
0 голосов
/ 06 апреля 2020

Вы также можете использовать by:

data$sequence <- 
unlist(with(data, by(ID, ID, seq_along)), use.names=FALSE)

или data.table:

data.table::data.table(data)[, sequence := seq_len(.N), by=ID][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...