мурлыкать, чтобы заменить разделение, применить, вывести вложенный столбец

Я понимаю, как использовать split, lapply и объединить выходные данные списка вместе, используя базу R. Я пытаюсь понять способ мурлыкать для этого. Я могу сделать это с базовым R и даже с purrr *, но предполагаю, поскольку я, кажется, дублирую переменную order, что я делаю это неправильно. Это кажется неуклюжим, так что я не думаю, что понимаю.

Каков подход tidyverse к использованию информации из подмножеств данных для создания вложенного выходного столбца?

Базовый подход R для создания вложенного столбца во фрейме данных

library(tidyverse)
set.seed(10)

dat2 <- dat1 <- data_frame(
    v1 = LETTERS[c(1, 1, 1, 1, 2, 2, 2, 2)],
    v2 = rep(1:4, 2),
    from = c(1, 3, 2, 1, 3, 5, 2, 1),
    to = c(1, 3, 2, 1, 3, 5, 2, 1) + sample(1:3, 8, TRUE)
)

dat1 <- split(dat1, dat1[c('v1', 'v2')]) %>%
    lapply(function(x){ 
        x$order <- list(seq(x$from, x$to))
        x
    }) %>%
    {do.call(rbind, .)}

dat1
unnest(dat1)

Мой мурлыкающий подход (каков правильный?)

dat2 %>%
    group_by(v1, v2) %>%
    nest() %>%
    mutate(order = purrr::map(data, ~ with(., seq(from, to))))  %>%
    select(-data) 

Желаемый результат

  v1       v2  from    to order    
* <chr> <int> <dbl> <dbl> <list>   
1 A         1     1     3 <int [3]>
2 B         1     3     4 <int [2]>
3 A         2     3     4 <int [2]>
4 B         2     5     6 <int [2]>
5 A         3     2     4 <int [3]>
6 B         3     2     3 <int [2]>
7 A         4     1     4 <int [4]>
8 B         4     1     2 <int [2]>

person Tyler Rinker    schedule 17.12.2018    source источник
comment
Я что-то не понимаю, или порядок вашего примера данных немного испорчен? Элементы outs располагаются в другом порядке, чем они отображаются во фрейме данных ...   -  person joran    schedule 17.12.2018
comment
@joran нет, я что-то упускаю ... позвольте мне исправить, это был игрушечный пример, и я пропустил это   -  person Tyler Rinker    schedule 17.12.2018
comment
Хорошо, а пока я поделюсь своей первоначальной мыслью, которая может оказаться неактуальной после того, как вы что-то исправите: mutate(dat2,order = map2(.x = from,.y = to,.f = seq)).   -  person joran    schedule 17.12.2018
comment
@joran в данном конкретном случае все. Вы можете написать в качестве ответа?   -  person Tyler Rinker    schedule 17.12.2018


Ответы (2)


В этом конкретном случае кажется, что вы ищете:

mutate(dat2,order = map2(.x = from,.y = to,.f = seq))
person joran    schedule 17.12.2018
comment
Поскольку у вас все красиво названо, вы также можете dat2 %>% mutate(order = pmap(., seq)) - person Jake Kaupp; 18.12.2018

Используя новый, экспериментальный, rap пакет:

remotes::install_github("romainfrancois/rap")

library(rap)

dat2 %>% 
  rap(order = ~ seq(from, to))
person Aurèle    schedule 18.12.2018