Также не уверен насчет элегантности, но выделите внутреннюю функцию как fun0a
и шаблон 'split-lapply' как tsplit
, и тогда вся итерация будет
fun0a <- function(x, ...)
1 - max(table(x) / length(x))
tsplit <- function(thresh, x, splt, fun, ...)
lapply(split(x, splt <= thresh), fun, ...)
sapply(1:9, tsplit, data$a2, tdata$a1, fun0a)
Это используетвнутренний lapply
вместо sapply
и разделяет один столбец данных напрямую, а не через индекс или весь фрейм данных.tsplit
и внешнее саппло может быть повторно использовано в аналогичных ситуациях, например, когда внутренняя функция фактически зависит от фрейма данных, передайте индексы (вычисленные один раз во внешнем саппли) вместо значений
fun0b <- function(i, df, ...)
1 - max(table(df[i,"a2"]) / length(i))
with(tdata,
sapply(1:9, tsplit, seq_along(a1), a1, fun0b, tdata))
tsplit
является tapply
, поэтому может быть реализовано как
tsplit <- function(thresh, x, splt, fun, ...)
tapply(x, splt <= thresh, fun, ...)