Как расширить фрейм данных на основе значений в том же фрейме данных в R - PullRequest
2 голосов
/ 09 марта 2020

У меня есть следующий тиббл, и я хочу определить время прибытия для каждого пассажира с распределением Пуассона rpois(n, lambda).

# A tibble: 3 x 4
  flight terminal passengers arrivaltime
  <chr>  <chr>         <dbl>       <dbl>
1 LX123  A                3         120
2 UA1    B                2         130

Окончательный тибб должен выглядеть следующим образом, и каждая строка представляет одного пассажира, время прибытия которого является выборкой из распределения Пуассона, а лямбда - время прибытия рейса в первом тибле.

# A tibble: 3 x 4
  flight terminal arrivaltime
  <chr>  <chr>         <dbl>
1 LX123  A              125
2 LX123  A              115
3 LX123  A              118
4 UA1    B              129
5 UA1    B              132

У меня уже есть следующий код, который вычисляет значения rpois и применяет его к таблице:

f = function(x, output){
  n = as.integer(x[[3]])
  lambda = as.integer(x[[4]])
  rpois(n, lambda)
} 
apply(tibble, MARGIN = 1, FUN = f)

Теперь у меня вопрос, как завершить мой подход к созданию второго фрагмента? , Поскольку используемый набор данных огромен, проблема заключается в быстрых вычислениях.

1 Ответ

1 голос
/ 09 марта 2020

Вот один вариант с tidyverse, где мы uncount на основе столбца «пассажиры», сгруппированные по «полету», применяем rpois с количеством строк (n()) и элементом first «время прибытия»

library(dplyr)
library(tidyr)
df1 %>%
    uncount(passengers) %>%
    group_by(flight) %>%
    mutate(arrivaltime = rpois(n(), first(arrivaltime)))

Или другой вариант - использовать от map2 до l oop над соответствующими элементами «пассажиров», «время прибытия» для применения rpois и unnest столбец list для расширения строк набора данных

library(purrr)
df1 %>%
  mutate(arrivaltime = map2(passengers, arrivaltime, rpois)) %>%
  unnest(c(arrivaltime))
# A tibble: 5 x 4
#  flight terminal passengers arrivaltime
#  <chr>  <chr>         <dbl>       <int>
#1 LX123  A                 3         127
#2 LX123  A                 3         110
#3 LX123  A                 3         131
#4 UA1    B                 2         109
#5 UA1    B                 2         133

data

df1 <- structure(list(flight = c("LX123", "UA1"), terminal = c("A", 
"B"), passengers = c(3, 2), arrivaltime = c(120, 130)), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...