runif для сгенерированных rnorm данных на строку - PullRequest
0 голосов
/ 15 октября 2018

У меня есть простая таблица с уменьшающимися числами и столбцом чередующихся «да» / «нет».

dat <- data.frame(a = c(8,8,6,6,4,4,2,2),
                  b = rep(c("yes", "no"), 4))

| 8 | "yes"
| 8 | "no"
| 6 | "yes"
| 6 | "no"
.. goes down to 2 | "no"

Затем я создаю еще один столбец для этой таблицы для каждой строки,в зависимости от «да» или «нет» с использованием rnorm.

dat$total_time = apply(dat, 1, 
 function(x) round( rnorm(1, mean=ifelse(x[2] == "yes", 140, 120), sd=10), 1))

Это дает мне таблицу, похожую на:

| 8 | "yes" | 148.3
| 8 | "no"  | 135.9
etc.

То, что я сейчас хочу, это создать еще один столбец для-row и для каждой строки получить случайное число из диапазона (x-30, x), где x - это недавно созданное число в третьей строке.

Я пытался:

dat$test_time = apply(dat, 1, function(x) runif(1, x[3]-30, x[3]))

но я получаю ошибку:

Ошибка в x [3] - 30: нечисловой аргумент бинарного оператора

, если я пробую его только с

runif(1, 0, x[3])

Я все еще получаю

Ошибка в runif (1, 0, x [3]): неверные аргументы

Но когда я нажимаю наВ таблице в R studio указано, что значения в третьей строке являются числовыми, поэтому я не знаю, в чем проблема.

1 Ответ

0 голосов
/ 15 октября 2018

Мы можем использовать dplyr с rowwise, что делает его очень простым.

library(dplyr)

dat %>%
  rowwise() %>%
  mutate(y =  round(rnorm(1, mean = ifelse(b == "yes", 140, 120), sd=10), 1), 
         z =  runif(1, y-30, y))


#     a  b       y     z
#  <dbl> <fct> <dbl> <dbl>
#1     8 yes   150.  131. 
#2     8 no    114.  111. 
#3     6 yes   142.  113. 
#4     6 no    123.  105. 
#5     4 yes   152.  135. 
#6     4 no    91.6  72.4
#7     2 yes   151.  140. 
#8     2 no    129.  127. 

Проблема с функцией apply заключается в том, что она преобразует фрейм данных в матрицу, а матрица может содержать только один тип значения, следовательно, она преобразует всю числовую переменную в символ и при добавлении числаперсонажу вы получите ошибку.Например, см.

"2" + 3

Ошибка в "2" + 3: нечисловой аргумент для двоичного оператора

Чтобы избежать преобразования числа в числовое значениев функции вызова apply, а затем использовать его

dat$test_time <- apply(dat, 1, function(x) 
        runif(1, as.numeric(x[3])-30, as.numeric(x[3])))


dat
#  a   b total_time test_time
#1 8 yes      133.0 132.61189
#2 8  no      115.2 114.26407
#3 6 yes      133.6 113.91254
#4 6  no      123.1 113.96119
#5 4 yes      121.3 104.90344
#6 4  no      107.5  80.98989
#7 2 yes      146.1 139.92842
#8 2  no      112.8 104.24055
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...