У меня есть данные со следующей структурой, и я пытаюсь реализовать функцию, которая для каждой строки назначает выбор, используя случайный полиномиальный генератор со значениями <Educ_W1:Educ_W5>
в качестве вектора вероятностей (они добавляют к одному по строке). Таким образом, для каждой строки новая переменная будет иметь значение от 1 до 5. Мне удалось реализовать это самостоятельно, но я пытаюсь найти более быстрый способ сделать это, так как в текущей версии это занимает слишком много времени (несколько дней. Данные содержат более 1 миллиона наблюдений).
| 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» однозначно идентифицирует каждую строку. Функция rMultinom
из пакета R Hmisc
генерирует полиномиальные случайные величины с различной вероятностью.
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
. Чтобы иметь дело с огромным набором данных, вам нужны операторы, которые можно векторизовать. - person Seymour   schedule 09.02.2018