How do I use approx() inside mutate_at() with a conditional statement in dplyr?

后端 未结 1 517
轻奢々
轻奢々 2021-01-15 03:13

I want to interpolate missing values using dplyr, piping, and approx().

Data:

test <- structure(list(site = structure(c(3L, 3L, 3L, 3L, 1L, 1L, 1         


        
1条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-15 03:43

    This will do what you are looking for...

    test_int2 <- test %>% 
                 group_by(site) %>% 
                 mutate_at(vars(c(var1, var2)),
                           funs("i"=if(sum(!is.na(.))>1) 
                                      approx(depth, ., depth, rule=1, method="linear")[["y"]] 
                                    else 
                                      NA))
    
    test_int2
    # A tibble: 12 x 6
    # Groups:   site [3]
          site depth  var1  var2 var1_i var2_i
               
     1 wetland     0     1     1    1.0    1.0
     2 wetland    -3    NA    NA    2.5    2.5
     3 wetland    -4     3     3    3.0    3.0
     4 wetland    -8     4     4    4.0    4.0
     5    lake     0     1    NA    1.0     NA
     6    lake    -1     2    NA    2.0     NA
     7    lake    -3    NA    NA    3.0     NA
     8    lake    -5     4    NA    4.0     NA
     9  stream     0     1    NA    1.0     NA
    10  stream    -2    NA     2    2.0     NA
    11  stream    -4    NA    NA    3.0     NA
    12  stream    -6     4    NA    4.0     NA
    

    0 讨论(0)
提交回复
热议问题