Ответ Тима Бигелайзена - это канонический способ решения проблемы, но известно, что 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](https://i.stack.imgur.com/9mLG9.png)