【发布时间】:2018-02-08 20:46:02
【问题描述】:
我有具有以下结构的数据,我正在尝试实现一个函数,该函数使用随机多项式生成器为每一行分配一个选择,其中值<Educ_W1:Educ_W5> 作为概率向量(它们逐行相加) .因此,对于每一行,新变量的值都在 1 到 5 之间。
我自己设法实现了它,但我试图找到一种更快的方法来实现它,因为在当前版本中它花费的时间太长(几天。数据包含超过 100 万个观察值)。
| IDhh|Year |Educ_W |Educ_H | Educ_W1| Educ_W2| Educ_W3| Educ_W4| Educ_W5|
|----:|:----|:------|:------|---------:|---------:|---------:|---------:|---------:|
| 1|1975 |2 |2 | 0.1645188| 0.3362659| 0.3940354| 0.0831637| 0.0220162|
| 2|1975 |2 |2 | 0.1645188| 0.3362659| 0.3940354| 0.0831637| 0.0220162|
| 5|1975 |2 |1 | 0.5103815| 0.2092249| 0.2285570| 0.0392398| 0.0125968|
| 6|1975 |3 |3 | 0.0811203| 0.1535407| 0.5528233| 0.1486548| 0.0638609|
| 8|1975 |1 |1 | 0.5103815| 0.2092249| 0.2285570| 0.0392398| 0.0125968|
| 10|1975 |3 |2 | 0.1645188| 0.3362659| 0.3940354| 0.0831637| 0.0220162|
目前我正在通过以下方式实现该功能,但我需要很长时间。这里,变量“IDhh”唯一标识每一行。 R 包Hmisc 中的函数rMultinom 生成具有不同概率的多项随机变量。
library(dplyr)
library(tidyr)
data %>%
select(IDhh, Year, Educ_W, Educ_H, Educ_W1 : Educ_W5) %>%
nest(-IDhh) %>%
mutate(
wanted_W = map(data, ~ rMultinom(t(c(.x$Educ_W1, .x$Educ_W2, .x$Educ_W3,
.x$Educ_W4, .x$Educ_W5)), 1))) %>%
unnest()
`
所需的输出如下所示,其中“Wanted_W”是新变量。
| IDhh| wanted_W|Year |Educ_W | Educ_W1| Educ_W2| Educ_W3| Educ_W4| Educ_W5|
|-------:|--------:|:----|:------|---------:|---------:|---------:|---------:|---------:|
| 18806| 3|1975 |3 | 0.1851884| 0.1577067| 0.4749609| 0.1394014| 0.0427427|
| 2442099| 4|2010 |1 | 0.4436620| 0.0987973| 0.3296288| 0.1013606| 0.0265513|
| 1351429| 3|1995 |3 | 0.0708855| 0.1023657| 0.5904598| 0.1784980| 0.0577910|
| 250232| 3|1980 |5 | 0.0337913| 0.0347975| 0.2156134| 0.2315768| 0.4842209|
| 1802868| 3|2005 |3 | 0.0371280| 0.0772428| 0.6054841| 0.2024385| 0.0777067|
| 715077| 2|1985 |3 | 0.1149756| 0.1412112| 0.5458910| 0.1413975| 0.0565248|
【问题讨论】:
-
我建议您使用函数
put来创建可重现的示例。除此之外,我认为瓶颈是函数rMultinom。为了处理海量数据集,您需要可以矢量化的运算符。
标签: r random dplyr purrr multinomial