Как извлечь случайное число из каждого значения в столбце данных - PullRequest
1 голос
/ 19 сентября 2019

Пример данных

set.seed(123)
df <- data.frame(x = runif(5, 0, 5), y = runif(5,0,5))

         x         y
1 1.437888 0.2277825
2 3.941526 2.6405274
3 2.044885 4.4620952
4 4.415087 2.7571751
5 4.702336 2.2830737

Я хотел бы создать столбец z, в котором из всех значений y случайное число вычитается между 0 и значениемy само по себе.

Подход

library(tidyverse)
df <- df %>% mutate(z = y - runif(n=1, min=0, max=y))

Задача

Случайное число генерируется только один раз, а затем извлекаетсяиз всех значений у, в то время как я хотел бы генерировать случайное число для каждого вычитания.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Если вы используете sapply, случайное число не поддерживается:

df$z <- sapply(1:nrow(df), function(t) df$y[t] - runif(n=1, min=0, max=df$y[t]))

df
      x         y          z
1 4.3658120 3.4449822 0.33968580
2 3.2087255 0.3607723 0.06576989
3 0.8543368 1.2724004 0.14831275
4 1.0649560 0.2387039 0.04146824
5 3.6421655 2.2787097 1.48823688

Для проверки

3.4449822 - 0.33968580 = 3.105296
2.2787097 - 1.48823688 = 0.7904728
0.2387039 - 0.04146824 = 1.488237
1 голос
/ 19 сентября 2019

Мы можем сгенерировать все случайные числа вместе и затем вычесть.

library(dplyr)

df %>% 
  mutate(rand = runif(n=n(), min=0, max=y), z = y - rand)

#         x         y      rand          z
#1 1.437888 0.2277825 0.1573306 0.07045192
#2 3.941526 2.6405274 2.1004535 0.54007390
#3 2.044885 4.4620952 0.1098286 4.35226662
#4 4.415087 2.7571751 1.3173671 1.43980793
#5 4.702336 2.2830737 1.7316190 0.55145467

Сохранение столбца rand, чтобы подтвердить, что у нас есть разные случайные числа для каждой строки.

В базе R мыможно сделать

transform(df, z = y - runif(nrow(df), min = 0, max = y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...