R:循环过滤

R: filtering in loop

我要通过循环在不同的数据集上执行 lm() ,这应该首先使用 filter() 制作数据集,然后在过滤后的数据集上执行 lm() 并保存结果。 但是,我总是遇到这个错误,我不知道自己做错了什么。

"Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels"

我的代码:

a<-c("var1", "var2", "var3") #character vector


for (b in a){
  dataset <- dataset%>%filter(variable_name == b)
  lm<- lm(y ~ x1 + x2, data=dataset)
assign(paste(b, "lm", sep='_'), lm)
}

有人可以帮帮我吗?我知道这真的很初级。根据搜索结果,我也尝试过

dataset <- dataset%>%filter(variable_name == **paste0("'",b,"'")**)

但总是出现同样的错误...谢谢!

使用行的子集更新全局环境中的原始对象将为后续迭代抛出错误,因为 == returns 'var2' 和 'var3' 0 行(当 dataset 在 'variable_name' 中只有 'var1' 值时)。相反,在循环中创建一个临时对象(也可以删除)

for (b in a){
  tmp <- subset(dataset, variable_name == b)
   model <- lm(y ~ x1 + x2, data = tmp)
   assign(paste(b, "lm", sep='_'), model)
   rm(tmp)
 }

在全局环境中创建单个 list 对象而不是多个对象可能更好。 split 会比 == 快,后者根据 'variable_name'

中的值将数据拆分为 list 中的数据子集
model_lst <- lapply(split(dataset, dataset$variable_name), function(tmp)
          lm(y ~ x1 + x2, data = tmp))

或者如果我们更喜欢使用 'a' 向量(假设 'variable_name' 中有更多 unique 值并且只需要基于 'a' 向量的模型)

model_lst <- lapply(a, function(b) {
            lm(y ~ x1 + x2, data = subset(dataset, variable_name == b)
  })