library(tidyverse)
library(purrr)
x <- c(20, 30, 58)
n <- 100

mylist <- data_frame(x = c(0, 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)

Как лучше всего преобразовать приведенный выше список в тиббл? муррр может быть? На самом деле я собираюсь использовать этот список внутри вызова mutate, чтобы добавить указанный список в виде столбца в другой тиббл.

# A tibble: 100 x 1
    grp
  <dbl>
1     1
2     1
3     1
4     1
etc...
0
stackinator 4 Ноя 2018 в 03:03

2 ответа

Лучший ответ

unnest() и rename()

library(tidyverse)

x <- c(20, 30, 58)
n <- 100

data_frame(x = c(0, 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))) %>%
  unnest(n) %>% 
  rename(grp = n)
## # A tibble: 100 x 1
##      grp
##    <int>
##  1     1
##  2     1
##  3     1
##  4     1
##  5     1
##  6     1
##  7     1
##  8     1
##  9     1
## 10     1
## # ... with 90 more rows
1
hrbrmstr 4 Ноя 2018 в 00:24

Я бы использовал комбинацию tibble и unlist. Сюда:

new_tibble <- tibble(grp = unlist(mylist))

##if you want to add it as column to a data frame, here is how I'd do it
mock_df <- tibble(x = rnorm(100),
              y = rnorm(100))

 mock_df %>% mutate(grp = unlist(mylist))
1
Harro Cyranka 4 Ноя 2018 в 00:17