如何根据R中同一数据框中的值扩展数据框
How to extend dataframe based on values in the same dataframe in R
我有以下小标题,我想用泊松分布 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
最后的小标题应该是这样的,每一行代表一个乘客,到达时间是泊松分布的样本,lambda 是第一个小标题中航班的到达时间。
# 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 的方法。由于使用的数据集很大,计算速度快是个问题。
这是一个带有 tidyverse
的选项,我们 uncount
基于 'passengers' 列,按 'flight' 分组,应用 rpois
的数量行 (n()
) 和 'arrivaltime'
的 first
元素
library(dplyr)
library(tidyr)
df1 %>%
uncount(passengers) %>%
group_by(flight) %>%
mutate(arrivaltime = rpois(n(), first(arrivaltime)))
或者另一种选择是使用 map2
循环遍历 'passengers'、'arrivaltime' 的相应元素以应用 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
数据
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"))
我有以下小标题,我想用泊松分布 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
最后的小标题应该是这样的,每一行代表一个乘客,到达时间是泊松分布的样本,lambda 是第一个小标题中航班的到达时间。
# 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 的方法。由于使用的数据集很大,计算速度快是个问题。
这是一个带有 tidyverse
的选项,我们 uncount
基于 'passengers' 列,按 'flight' 分组,应用 rpois
的数量行 (n()
) 和 'arrivaltime'
first
元素
library(dplyr)
library(tidyr)
df1 %>%
uncount(passengers) %>%
group_by(flight) %>%
mutate(arrivaltime = rpois(n(), first(arrivaltime)))
或者另一种选择是使用 map2
循环遍历 'passengers'、'arrivaltime' 的相应元素以应用 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
数据
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"))