Я использовал соединение ifelse
data1$accuracy_category <- ifelse(abs(data1$accuracy_percentage)<10, "Good",
ifelse(abs(data1$accuracy_percentage)<30, "Bad", "Worst"))
дает
> head(data1)
actuals forecast diff accuracy_percentage accuracy_category
1 0.0 10.0 -10.0 -Inf Worst
2 0.1 9.9 -9.8 -9800.000 Worst
3 0.2 9.8 -9.6 -4800.000 Worst
4 0.3 9.7 -9.4 -3133.333 Worst
5 0.4 9.6 -9.2 -2300.000 Worst
6 0.5 9.5 -9.0 -1800.000 Worst
и как указывал @ пьер-Lafortune, это легче читать, но менее производительным. В духе Knuth Я провел несколько тестов. С вашим начальным набором:
> system.time(data1$accuracy_category <- ifelse(abs(data1$accuracy_percentage)<10, "Good",
+ ifelse(abs(data1$accuracy_percentage)<30, "Bad", "Worst")))
user system elapsed
0 0 0
> system.time(data1$accuracy_level <- cut(abs(data1$accuracy_percentage), c(0, 10, 30, Inf), c("Good", "Bad", "Worst"), include.lowest=T))
user system elapsed
0.000 0.000 0.001
, но это на самом деле не говорит. Так что давайте провернуть его :) С
actuals=seq(0,100000,0.1)
forecast=seq(100000,0,-0.1)
Я получил
> system.time(data1$accuracy_category <- ifelse(abs(data1$accuracy_percentage)<10, "Good",
+ ifelse(abs(data1$accuracy_percentage)<30, "Bad", "Worst")))
user system elapsed
0.776 0.060 0.840
> system.time(data1$accuracy_level <- cut(abs(data1$accuracy_percentage), c(0, 10, 30, Inf), c("Good", "Bad", "Worst"), include.lowest=T))
user system elapsed
0.152 0.003 0.155
который не показать, что cut
будет гораздо более производительным, как вы масштабы. Все это говорит о том, что cut
более изящный, если не менее читаемый, и я поддержал его ответ :) ymmv.
Вы можете использовать 'ifelse' вместо' if/else' или лучше использовать 'cut' и указывать' label' – akrun
, первая строка вашего df имеет значение 'inf'. '0.0 10.0 -10.0 -Inf' –
Лучшая практика заключается в том, чтобы использовать пробел, чтобы вы и другие могли читать ваш код, и вы случайно не выполняете' x <-1' при попытке проверить 'x <-1' – Frank