麻烦使用base-R`rep()`和dplyr

sta*_*tor 2 r dplyr

library(tidyverse)
x <- c(0, 20, 30, 58)
n <- 100
df <- data_frame(x, n) %>% 
  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)
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.当我尝试最后一步管道进入它破坏的一切.我的语法有什么用?我希望一切都成为一个长管.我认为这是不可能的,因为我需要将我的整个管道(上面的代码块)嵌套在我的rep()调用中?那是对的吗?

library(tidyverse)
x <- c(0, 20, 30, 58)
n <- 100
df <- data_frame(x, n) %>% 
  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(x), y) %>% 
  print()
Run Code Online (Sandbox Code Playgroud)

function_list [i]出错:找不到对象'y'

akr*_*run 5

由于它不在mutate/summarise函数之内,我们需要pull或提取它

data_frame(x, n) %>% 
  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(.$x), .$y)}
Run Code Online (Sandbox Code Playgroud)

或者它也可以写成

data_frame(x, n) %>% 
 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)) %>% 
 summarise(n = list(rep(row_number(), y))) %>%
 pull(n)
Run Code Online (Sandbox Code Playgroud)

  • `{}`-wrapper需要省略管道到第一个可能参数的默认行为.`.$ VAR_NAME`将列值从整个数据集中拉出来作为向量. (2认同)