【问题标题】:How to extend dataframe based on values in the same dataframe in R [duplicate]如何根据R中相同数据帧中的值扩展数据帧[重复]
【发布时间】:2020-06-21 15:59:21
【问题描述】:

我有以下 tibble,我想使用泊松分布 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

最后的 tibble 应该是这样的,每一行代表一个乘客,到达时间是泊松分布的一个样本,lambda 是第一个 tibble 中航班的到达时间。

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

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

【问题讨论】:

    标签: r function apply probability tibble


    【解决方案1】:

    这是tidyverse 的一个选项,其中我们uncount 基于“乘客”列,按“航班”分组应用rpois 与行数(n()) 和first 元素'到达时间'

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

    或者另一种选择是使用map2 循环遍历'passengers'、'arrivaltime' 的相应元素以应用rpoisunnest 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
    

    数据

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2021-03-21
      • 1970-01-01
      • 2023-03-19
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多