Вот довольно быстрый базовый ответ. Это будет очень быстро, если набор данных довольно мал по сравнению с объемом доступной оперативной памяти.
dat[] <- findInterval(as.matrix(dat), vec = c(4, 27),
rightmost.closed=TRUE) - 1L
Здесь, поскольку каждый столбец имеет одинаковые разрывы, вы конвертируете копию data.frame в матрицу и запускаете findInterval
, используя эти разрывы. Rightmost.closed = TRUE гарантирует, что эти значения включены в их набор. Затем, поскольку findInterval
возвращает значения, начинающиеся с 0, вычтите 1, чтобы получить нужные значения.
Использование dat[] <-
помещает полученный вектор в data.frame.
Это возвращает
dat
var1 var2 var3
1 1 0 -1
2 0 1 -1
данные
dat <-
structure(list(var1 = c(30L, 20L), var2 = c(13L, 29L), var3 = 2:3),
.Names = c("var1", "var2", "var3"), class = "data.frame",
row.names = c(NA, -2L))