首页 > 解决方案 > R:循环过滤

问题描述

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

contrasts<-( *tmp*, value = contr.funs[1 + isOF[nn]]) 中的错误:
对比只能应用于具有 2 个或更多级别的因子”

我的代码:

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,"'")**)

但总是得到同样的错误......谢谢!

标签: rloopsfiltercharacter

解决方案


使用行子集更新全局环境中的原始对象将引发后续迭代错误,==因为“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”向量(假设unique“variable_name”中有更多值并且只想要基于“a”向量的模型)

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

推荐阅读