【问题标题】:R: filtering in loopR:循环过滤
【发布时间】:2021-07-04 17:18:41
【问题描述】:

我要通过循环对不同的数据集执行 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,"'")**)

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

【问题讨论】:

  • 您在每次迭代中更新全局 env 中的 dataset,当您进入下一次迭代时会失败,而是创建临时数据集(在第一次迭代之后,数据集只有 variable_name 值为 ' var1' .e. tmp &lt;- dataset%&gt;%filter(variable_name == b) 并在 lm 中使用它

标签: r loops filter character


【解决方案1】:

使用行子集更新全局环境中的原始对象将引发后续迭代错误,因为 == 为 'var2' 和 'var3' 返回 0 行(当 dataset 只有 '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)
  })

【讨论】:

  • 啊好吧,我明白我现在做错了什么!非常感谢!!
猜你喜欢
  • 2019-07-14
  • 2021-07-06
  • 2020-06-02
  • 2022-11-02
  • 2019-07-28
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多