переписать базовую функцию R с помощью dplyr - используя фильтр вместо [] - PullRequest
0 голосов
/ 29 октября 2018
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(c(20, 30, 58), 100)

Как бы я переписал эту функцию, используя dplyr? Я довольно хорошо разбираюсь в тидиверсе, но никогда не изучал базу R. Я даже не знаю, что эта функция делает выше. Если я вижу его в синтаксисе Tidyverse, я могу понять функцию (, вероятно, ). Который является моей конечной целью.

Все глаголы tidyverse имеют смысл, но этот материал [, x] [[df]] - нет.

Ответы [ 2 ]

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

Вот переформатированная версия с использованием более похожего на tidyverse кода:

x %>% 
  unique %>%
  keep(~.>=0 & .<n) %>%
  sort %>%
  c(0,.,n) %>%
  diff %>%
  list(lengths = ., values = seq_along(.)) %>%
  inverse.rle

# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
# [31] 3 3 3 3 3 3 3 3 3 3 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 4 4 4 4 4 4 4 4 4 4
# [91] 4 4 4 4 4 4 4 4 4 4
0 голосов
/ 29 октября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...