我可以为 R 说话,它比 SAS 过程中的 by 语句要冗长一些。通常,范式是拆分、应用、组合。您将至少有以下两个选项。假设您将数据存储为 df 对象。我实际上并没有运行任何代码。
Tidyverse 和扫帚
这对于 '%>%' 管道运算符和 tidyverse 术语来说不会那么直观。但是,这可能是执行此操作的更简洁的方法之一。
# 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)
拆分、应用、合并循环
恕我直言,循环结构使这更容易理解。
#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 函数是如何“应用”在各种数据子集上的。 function(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 子句的参数。