Ответ, основанный на моем комментарии выше (но я изменил код, чтобы он действительно работал):
x <- c("123", "224", "221", "1912323", "445")
apply(sapply(1:9, function(p) grepl(p, x)), 1, function(k) max(which(k)))
# the above will work if 0 is never the largest number in any cell
Более обобщенная версия:
doit <- function(x) apply(sapply(0:9, function(p) grepl(p, x)), 1, function(k) max(which(k)))-1
x <- c("123", "224", "221", "1912323", "445", "000")
doit(x)
# [1] 3 4 2 9 5 0
Это примерно в 3 раза быстрее, чем оригинальный код с использованием strsplit ... но я уверен, что есть возможности для улучшения. Хм ... на самом деле, я попробую снова с strsplit
:
doit3 <- function(.) sapply(strsplit(.,""), max)
doit3(x)
# [1] "3" "4" "2" "9" "5" "0"
Это примерно в 5 раз быстрее, чем мой предыдущий подход. Таким образом, проблема была не в sapply
или strsplit
, а в других компонентах. Если вам нужно преобразовать его в числовой, добавьте as.numeric
к внешнему слою, это не займет много дополнительного времени:
doit4 <- function(.) as.numeric(sapply(strsplit(.,""), max))
> doit4(x)
# [1] 3 4 2 9 5 0