Я могу говорить от имени R, который будет немного более подробным, чем оператор by в процедурах SAS. Как правило, парадигма разделяется, применяется, объединяется. У вас будет как минимум два следующих варианта. Предположим, у вас есть данные, хранящиеся как объект df. На самом деле я не запускал никакой из этого кода.
Tidyverse и Broom
Это будет не так интуитивно понятно с операторами трубы '%>%' и tidyverse lin go. Однако, вероятно, это один из наиболее кратких способов сделать это.
# Not run
library(tidyverse)
library(broom)
models <- df %>%
nest(-SpeciesID) %>%
mutate(fit = map(data, ~ lmer(Total~Location + (1|REP), data = .),
results = map(fit, glance))%>%
unnest(results)
models %>% select(-fit, -data)
Split, Apply, Combine in al oop
ИМХО, конструкция цикла упрощает понимание.
#Not run
split <- split(df, SpeciesID)
models <- list()
for (i in 1:length(split)) {
model_df <- split[[i]]
models[[i]] <- lmer(Total~Location + (1|REP), data=model_df)
}
sapply(1:length(models), function(x) {summary(models[[x]]})
Базовый метод применения R
Этот метод довольно краток и снова подчеркивает, как функция lmer «применяется» к различным подмножествам данных. Функция (x) является анонимной функцией, где x является своего рода итератором на всех уровнях df $ SpeciesID.
by(df,df$SpeciesID, function(x) summary(lmer(Total~Location + (1|REP),data = x)))
* Решение из комментария Onyambu
Я уверен, что есть другие альтернативы, но я надеюсь, что это поможет. Для человека, который перешел с SAS в основном на R, это, несомненно, одна из вещей, которые SAS упрощает; Функции моделирования R редко имеют параметр, аналогичный предложению SAS by.