Просто включите list()
внутри split
в нужных столбцах. Однако для вашего примера это приведет к ошибке, поскольку некоторые группы имеют одинаковые значения distance .
lapply(split(df, list(df$color, df$phase)), function(d) {
kruskal.test(val ~ distance, data=d)
})
Ошибка в kruskal.test.default (c (76.6759299905971, 3.11371604911983,
17.6471394719556,: все наблюдения находятся в одной группе
Следовательно, рассмотрим перенос в tryCatch
, чтобы вернуть NA
или любой другой объект для этих групп проблем:
lapply(split(df, list(df$color, df$phase)), function(d) {
tryCatch({ kruskal.test(val ~ distance, data=d) },
error = function(e) NA)
})
Кстати, рассмотрим by
(объектно-ориентированную оболочку для tapply
и часто пропускаемый член семейства apply) вместо того, чтобы вкладывать split
в lapply
:
by(df, df[c("color", "phase")], function(d) {
tryCatch({ kruskal.test(val ~ distance, data=d) },
error = function(e) NA)
})