簡體   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