如何在R中根据同一数据框中的值扩展数据框

3
我有以下数据表格,想要使用泊松分布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值并将其应用于tibble的代码:

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

我现在的问题是如何完成我的方法来创建第二个tibble。鉴于使用的数据集很大,快速计算是一个问题。

1个回答

2

这里有一个使用tidyverse的选项,我们基于'passengers'列进行uncount操作,然后按'flight'分组,使用行数(n())和'arrivaltime'的first元素应用rpois

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

另一个选项是使用map2来循环遍历'passengers'和'arrivaltime'的相应元素,应用rpoisunnest列表列以扩展数据集行。

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

数据

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"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接