1

I have some code similar to this:

library(tidyverse)
library(broom)

df <- tribble(~group, ~set, ~x, ~y,
  0, "training", 1, 2,
  0, "training", 2, 4,
  0, "training", 4, 9,
  0, "training", 5, 9,
  0, "training", 15, 29,
  0, "training", 20, 42,
  0, "training", 21, 42,
  0, "training", 25, 49,
  0, "test", 10, NA,
)
df %>%
  filter(set == "training") %>%
  group_by(group) %>%
  do(pm = lm(y ~ x, data = .)) %>%
  left_join(df, ., by = "group")

So I get something like this:

  group      set    x     y     model   
  <dbl>  <chr>    <dbl> <dbl>  <list>  
1    0. training    1.    2. <S3: lm>
2    0. training    2.    4. <S3: lm>
3    0. training    4.    9. <S3: lm>
4    0. training    5.    9. <S3: lm>
5    0. training   15.   29. <S3: lm>
6    0. training   20.   42. <S3: lm>
7    0. training   21.   42. <S3: lm>
8    0. training   25.   49. <S3: lm>
9    0. test       10.   NA  <S3: lm>

How to use the linear model in the 9th row where set is equal to "test" to predict y from x? Thank you in advance for your help

Jon Spring
  • 55,165
  • 4
  • 35
  • 53

1 Answers1

0

We can replace the NA elements in 'y' with the predict output based on the lm model on the same row after grouping by 'group'

library(dplyr)
df %>%
  filter(set == "training") %>%
  group_by(group) %>%
  do(pm = lm(y ~ x, data = .)) %>%
  left_join(df, ., by = "group") %>%
  group_by(group) %>% 
  mutate(y = replace(y, is.na(y), predict(pm[[1]],  
        newdata = data.frame(x = x[set == "test"]))))
# A tibble: 9 x 5
# Groups:   group [1]
#  group set          x     y pm    
#  <dbl> <chr>    <dbl> <dbl> <list>
#1     0 training     1   2   <lm>  
#2     0 training     2   4   <lm>  
#3     0 training     4   9   <lm>  
#4     0 training     5   9   <lm>  
#5     0 training    15  29   <lm>  
#6     0 training    20  42   <lm>  
#7     0 training    21  42   <lm>  
#8     0 training    25  49   <lm>  
#9     0 test        10  20.0 <lm>  
akrun
  • 874,273
  • 37
  • 540
  • 662