繁体   English   中英

for 循环未在 R 中迭代

[英]for loop not iterating in R

我有一个大的 df 遵循下面的结构。 对于 200 组中的每一组,我想将线性 model 拟合到 30 年的数据,然后提取斜率和 R 的平方。

   count <- c(5, 10, 15, 20, 2, 4, 6, 8, 1, 2, 3, 4, 10, 20, 30, 40)
   group <- c(0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3)
   year <- c(2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003)
   df <- data.frame(count, group, year)

我能够像这样一次获得一组我想要的数据

   group_1 <- filter(df, group == 1)
   lm_group1 <-  lm(count ~ year, data = group_1)
   lm_coef_1 <- lm_group_1$coefficients["year"]
   lm_rsq_1 <-  summary(lm_group_1)$adj.r.squared
   df_group_1 <- data.frame(lm_coef_1, lm_rsq_1)

通过复制粘贴执行此操作 200 次是不明智的,因此我尝试使用 for 循环实现自动化。

    for (i in df$group) {

         group_data <- filter(df, group == i)

         lm_g <-  lm(count ~ year, data = group_data) 
           lm_coef <- lm_g$coefficients["year"] 
           lm_rsq <- summary(lm_g)$adj.r.squared  
           df_i <- data.frame(lm_coef, lm_rsq)

         if (i == 199)
         break
    }

这会运行并且不会引发任何错误。 但是,它不是生成 200 个 dfs,每组一个,而是生成一个单独的 df,df_i。

我尝试用 i (lm_i, lm_coef_i, lm_rsq_i, df_i) 命名所有变量; 已尝试在语句之间插入 %>%; 已尝试寻找类似问题的示例。 试图从扫帚 package 中应用整洁的 function,但它似乎放弃了 r 平方,或者至少我找不到它。

首先,我想知道为什么这个循环拒绝迭代。 但是,我愿意接受并欣赏其他有关如何更优雅地解决此问题的建议。

只是在变量名后面加上i不会自动创建一个新的 object。 我认为您要做的是制作一个包含 200 个索引的列表,其中包含您想要的各个数据框。

#make a list the size of your expected output

my_df_list <- vector("list", 200)

 for (i in df$group) {

         group_data <- filter(df, group == i)

         lm_g <-  lm(count ~ year, data = group_data) 
           lm_coef <- lm_g$coefficients["year"] 
           lm_rsq <- summary(lm_g)$adj.r.squared  
           my_df_list[[i]] <- data.frame(lm_coef, lm_rsq)

         if (i == 199)
         break
    }

这样,您可以在迭代时将每个 data.frames 分开。

你也可以这样做:

library(tidyverse)

df %>%
  group_by(group) %>%
  summarise(d = list(tibble(coef_year = coef(a<-lm(count~year, cur_data()))['year'],
                          adjusted_r_sq = summary(a)$adj.r.sq)))

我们可以使用broom

library(dplyr)
library(broom)
library(tidyr)
df %>% 
  group_by(group) %>%
  summarise(out = list(glance(lm(count ~ year, data = cur_data())) %>% 
               select(r.squared, adj.r.squared))) %>%
 unnest(out)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM