用dplyr重写基本R函数-使用过滤器代替[]

时间:2018-10-29 14:41:30

标签: r function dplyr

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重写此函数?我在tidyverse上还不错,但是从来没学过R。我什至不知道上面的函数在做什么。如果我在tidyverse语法中看到它,则可以理解该功能(可能)。这是我的最终目标。

所有tidyverse动词都有意义,但是[,x] [[df]]这东西没有意义。

2 个答案:

答案 0 :(得分:2)

这是使用更多类似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

答案 1 :(得分:1)

x看起来像是一个向量。第一步使用unique,与tidyverse中的distinct相同。下一行使用[运算符,该运算符用于索引向量或矩阵。 [ ]内部的值(出于所有意图和目的)应求值为TRUEFALSE值或数字的向量。这与tidyverse中的filter相同。下一行在order上使用x,与arrange相同。最后一步做两件事:1)重复seq_along(x)中的值,在此示例中,这些值为1、2、3和4。然后合并x和{{1} }在一起,得到n,然后在它们上运行c(0, 20, 30, 58, 100),它将采用第二个元素,减去第一个元素,采用第三个元素,减去第二个元素,依此类推。以此类推,我们得到{{1} },因为(20-0)= 20,(30-20)= 10,依此类推。这最后一步是使用diff函数在tidyverse中可以实现的目标。 c(20, 10, 28, 42)函数没有直接的tidyverse等效项。正如上面的评论中提到的那样,该函数不能转换为tidyverse函数,因为这些函数用于数据帧,并且您具有矢量。我同意您应该学习R底数。您只能使用tidyverse。

更新:

根据要求添加此代码的整版版本。

lag