x
выглядит как вектор. На первом шаге используется unique
, который будет таким же, как distinct
в тидиверсе. В следующей строке используется оператор [
, который используется для индексации вектора или матрицы. Значение внутри [ ]
должно (для всех намерений и целей) соответствовать вектору значений или чисел TRUE
или FALSE
. Это то же самое, что и filter
в тидиверсе. Следующая строка использует order
для x
, что совпадает с arrange
. Последний шаг делает две вещи: 1) он повторяет значения из seq_along(x)
, которые, в этом примере, будут 1, 2, 3 и 4. Затем он объединяет x
и n
вместе, что дает c(0, 20, 30, 58, 100)
, а затем запускает diff
на них, который возьмет второй элемент и вычтет первый, возьмет третий элемент и вычтет второй, и т. Д. Это дает нам c(20, 10, 28, 42)
, потому что (20-0) = 20, (30 -20) = 10 и т. Д. Этот последний шаг - то, что может быть достигнуто в тидиверсе с использованием функции lag
. Функция rep
не имеет прямого обратного эквивалента. Как было упомянуто в комментариях выше, это не может быть преобразовано в функции tidyverse, потому что они предназначены для информационных кадров, и у вас есть вектор. Я согласен, что вы должны изучать базу R. Вы можете продвинуться так далеко только с помощью тидиверса.
UPDATE:
Добавление новой версии этого кода по запросу.
makeparts <- function(x, n) {
x <- unique(c(0, x))
x <- x[x >= 0 & x < n]
x <- x[order(x)]
x <- rep(c(seq_along(x)), diff(c(x, n)))
x
}
makeparts_tidyverse <- function(x, n) {
df = data_frame(x = c(0, x)) %>%
distinct() %>%
filter(x >= 0 & x < n) %>%
arrange(x) %>%
bind_rows(data_frame(x = n)) %>%
mutate(lag_x = lag(x)) %>%
mutate(y = x - lag_x) %>%
filter(!is.na(y))
rep(seq_along(df$x), df$y)
}
> makeparts(c(20, 30, 58), 100)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[21] 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
[41] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4
[61] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[81] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
> makeparts_tidyverse(c(20, 30, 58), 100)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[21] 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
[41] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4
[61] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[81] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4