2017-10-10 68 views
2

我想用dplyr,piping和approx()來插入缺失值。如何在dplyr中的條件語句中使用mutate_at()內的approx()?

數據:

test <- structure(list(site = structure(c(3L, 3L, 3L, 3L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L), .Label = c("lake", "stream", "wetland"), class = "factor"), 
    depth = c(0L, -3L, -4L, -8L, 0L, -1L, -3L, -5L, 0L, -2L, 
    -4L, -6L), var1 = c(1L, NA, 3L, 4L, 1L, 2L, NA, 4L, 1L, NA, 
    NA, 4L), var2 = c(1L, NA, 3L, 4L, NA, NA, NA, NA, NA, 2L, 
    NA, NA)), .Names = c("site", "depth", "var1", "var2"), class = "data.frame", row.names = c(NA, 
-12L)) 

此代碼:

library(tidyverse) 

# interpolate missing var1 values for each site using approx() 
test_int <- test %>% 
    group_by(site) %>% 
    mutate_at(vars(c(var1)), 
      funs("i" = approx(depth, ., depth, rule=1, method="linear")[["y"]])) 

但代碼將不再有效,如果遇到分組(網站& VAR)不具有至少2個非NA值,例如,

# here I'm trying to interpolate missing values for var1 & var2 
test_int2 <- test %>% 
    group_by(site) %>% 
    mutate_at(vars(c(var1, var2)), 
      funs("i" = approx(depth, ., depth, rule=1, method="linear")[["y"]])) 

R適當地引發此錯誤: mutate_impl錯誤(.data,dots): 評估錯誤:需要至少兩個非NA值進行插值。

如何包含條件語句或過濾器,以便它只嘗試插入站點至少有2個非NA值並跳過其餘部分或返回NA的情況?

+0

運行你的代碼,如果我們只用了VAR2這是行不通的。我相信這與湖的網站有關。它在分組內沒有任何值用於處理。這是一個數據問題,而不是dplyr。 – jacobsg

+0

是的,你重申了我最初的問題。這就是爲什麼我要求條件語句的原因,所以如果代碼遇到一個沒有至少2個非NA值的站點&var組合,它不會停止。感謝Andrew Gustar提供以下解決方案。 –

+0

啊我不好。我沒有仔細閱讀。歡呼 – jacobsg

回答

0

這將你在找什麼...

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 
    <fctr> <int> <int> <int> <dbl> <dbl> 
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 
+1

這個伎倆!謝謝! –