Если значение равно X, как я могу проверить, меньше ли X, чем 0,05, и написать «ДА» или «НЕТ» в другой ячейке в data.frame в R? - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующий тип файла (переменная "a"):

P                   OK
0.009109607206037   NA
0.296054274328919   NA
0.359366011629242   NA
4.77143881428015E-05    NA
0.002556197639041   NA
1.68489333654225E-05    NA
0.413536654401798   NA
7.8906355718309E-06 NA
0.183951454595559   NA
0.018652061230313   NA
9.62042790189634E-15    NA
0.151533362472736   NA
0.037140932397797   NA
0.350401082523352   NA
0.673474391454102   NA
0.000329419618776   NA

Это данные, сгенерированные в R в data.frame, я вычислил P-значение, но,В последнем файле у меня более 5000 строк, поэтому, чтобы упростить мою жизнь, я поставил маркер в качестве последнего столбца, но не могу понять, как создать условие if / else здесь.

Итак, я попробовал:

If a$P<0.05
 a$OK <- "Significant"
Else
 a$OK <- "Not-Significant

Но это не сработало ... Может кто-нибудь помочь мне исправить это в R?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Ответ Тима Бигелайзена - это канонический способ решения проблемы, но известно, что ifelse медленный.
Вот две альтернативы.Они создают индекс и используют его для получения значений из вектора строк.
Первый использует логический результат, а затем добавляет 1, поскольку R основывается на единице.
Второй использует findInterval.

OK1 <- c("Significant", "Non-Signficant")[(a$P >= 0.05) + 1]
OK2 <- c("Significant", "Non-Signficant")[findInterval(a$P, c(0, 0.05, 1))]
OK3 <- ifelse(a$P < 0.05, "Significant", "Non-Signficant")

identical(OK1, OK2)    # TRUE
identical(OK1, OK3)    # TRUE

Теперь несколько сравнений скорости.

library(ggplot2)
library(microbenchmark)

mb <- microbenchmark(
  loginx = c("Significant", "Non-Signficant")[(a$P >= 0.05) + 1],
  findInt = c("Significant", "Non-Signficant")[findInterval(a$P, c(0, 0.05, 1))],
  ifelse = ifelse(a$P < 0.05, "Significant", "Non-Signficant")
)

mb
#Unit: microseconds
#    expr    min      lq     mean  median      uq    max neval
#  loginx 14.450 15.8580 17.52272 16.7705 18.6525 63.106   100
# findInt 18.726 21.0170 23.00090 23.2135 24.3680 46.071   100
#  ifelse 31.940 33.0065 33.70410 33.4330 33.9235 48.500   100


autoplot(mb)

enter image description here

0 голосов
/ 21 января 2019

Использование ifelse:

a$OK <- ifelse(a$P < 0.05, "Significant", "Non-Signficant")

Функция ifelse векторизована, что означает, что вышеприведенное заполнит весь столбец OK в вашем фрейме данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...