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]]这东西没有意义。
答案 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
相同。下一行使用[
运算符,该运算符用于索引向量或矩阵。 [ ]
内部的值(出于所有意图和目的)应求值为TRUE
或FALSE
值或数字的向量。这与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