library(dplyr)
library(tidyr) #nest
library(broom) #tidy
library(purrr) #map
df %>% group_by(Region,Illness_Code) %>% nest() %>%
mutate(fit=map(data, ~lm(COUNT~YEAR, data = .)), results = map(fit, tidy)) %>%
unnest(results)
# A tibble: 6 x 7
Region Illness_Code term estimate std.error statistic p.value
<fct> <fct> <chr> <dbl> <dbl> <dbl> <dbl>
1 A ABC (Intercept) 111984. 51770. 2.16 0.276
2 A ABC YEAR -55.5 25.7 -2.16 0.276
3 B XYZ (Intercept) 212804. 3494736. 0.0609 0.961
4 B XYZ YEAR -105. 1734. -0.0605 0.962
5 C ABC (Intercept) 211768. 122153. 1.73 0.333
6 C ABC YEAR -105. 60.6 -1.73 0.333
Использование lapply
и split
#Identify list elements with nrow greater than one
Ind <- sapply(split(df1, list(df1$Region,df1$Illness_Code)), function(x)nrow(x)>1)
lapply(
#Loop only throught list elements wiht nrow>1
split(df, list(df$Region,df$Illness_Code))[Ind],
function(x){
#browser()
m <- lm(formula = COUNT ~ YEAR, data = x)
#coef(m)
as.data.frame(cbind(t(coef(m)), 'Year_2016'=x[x$YEAR==2016,'COUNT']))
})
По умолчанию split(df1, list(df1$Region,df1$Illness_Code))
создаст список, содержащий все взаимодействия между уровнями Region
и Illness_Code
, но некоторые из нихвзаимодействия с nrow = 0, например $B.ABC
и $A.XYZ
, которые позже вызовут проблемы, поэтому мы должны удалить их, используя индикатор