2017-10-26 1 views
3

dplyr, piping 및 spline()을 사용하여 누락 된 값을 보간하고 싶습니다.dplyr에서 x- 범위의 스플라인() 보간을 첫 번째 및 마지막 비 NA 값으로 어떻게 제한합니까?

데이터 :

test <- structure(list(site = structure(c(3L, 3L, 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, -10L, -14L, 
    0L, -1L, -3L, -5L, 0L, -2L, -4L, -6L), var1 = c(NA, 1L, 3L, NA, 
    6L, NA, 1L, 2L, NA, 4L, 1L, NA, NA, 4L), var2 = c(1L, NA, 3L, 
    4L, 8L, NA, NA, NA, NA, NA, NA, 2L, NA, NA)), .Names = c("site", 
    "depth", "var1", "var2"), class = "data.frame", row.names = c(NA, 
    -14L)) 

Q1 : I는 다음의 기능 코드를 사용하지만, 먼저 비 NA 값과 각 변수의 마지막 비 NA 값 사이에 발생하는 보간의 범위를 제한 할되다. 예를 들어, 깊이 -8wetland의 경우 var1을 보간하고 깊이가 0-14 인 경우 NA을 반환해야합니다.

library(tidyverse) 

test_int <- test %>% 
    group_by(site) %>% 
    mutate_at(vars(c(var1, var2)), 
       funs("i" = if(sum(!is.na(.)) > 1) 
          spline(x=depth, y=., xout=depth)[["y"]] 
         else 
          NA)) 

Q2 : 0에서 Inf 내 보간 값을 결합 할 수있는 방법이 있습니까? 또는 스플라인에 적합하지 않습니까 (예 : smooth 또는 loess과 같은 다른 보간법을 사용해야합니까?)?

+0

, 적절한 변환을 사용합니다. 즉,'y'를 보간하는 대신'log (y)'(또는'log1p (y)'가 0 일 경우)를 보간 한 다음, 예상에 역변환을 적용합니다. – Gregor

+0

보간 값을 그룹의 최대 값보다 크게 설정 하시겠습니까? 예 :'-8' 깊이의 '습지'는'6.7'입니까? (보간법을'var'의 최대 값과 최소값 내로 제한하기를 원한다면 해결책을 제시 할 수 있습니다.) –

+0

@JensLeerssen 아마도 보간 값을 최대 및 최소 관측 값으로 제한하는 것이 효과적 일 것이라고 생각합니다. –

답변

0

너무 좋지 않지만 초과 값을 걸러 낼 수 있습니다. 부작용은 minmax 한계를 넘어선 보간 된 값을 걸러내는 것입니다.

test_clean <- 
    test %>% 
    group_by(site) %>% 
    mutate_at(vars(c(var1, var2)), 
       funs(c("c" = if(sum(!is.na(.)) > 1) 
          spline(x=depth, y=., xout=depth)[["y"]] 
         else NA), 
        "min" = min(., na.rm = TRUE), 
        "max" = max(., na.rm = TRUE) 
        ) 
      ) %>% 
    mutate(var1_i = if_else(var1_c >= var1_min & var1_c <= var1_max, var1_c, NA_real_), 
      var2_i = if_else(var2_c >= var2_min & var2_c <= var2_max, var2_c, NA_real_)) %>% 
    select(site:var2, ends_with("i")) 

test_clean 
# A tibble: 14 x 6 
# Groups: site [3] 
     site depth var1 var2 var1_i var2_i 
    <fctr> <int> <int> <int> <dbl> <dbl> 
1 wetland  0 NA  1  NA 1.000000 
2 wetland -3  1 NA 1.0 3.078125 
3 wetland -4  3  3 3.0 3.000000 
4 wetland -8 NA  4  NA 4.000000 
5 wetland -10  6  8 6.0 8.000000 
6 wetland -14 NA NA  NA  NA 
7 lake  0  1 NA 1.0  NA 
8 lake -1  2 NA 2.0  NA 
9 lake -3 NA NA 3.4  NA 
10 lake -5  4 NA 4.0  NA 
11 stream  0  1 NA 1.0  NA 
12 stream -2 NA  2 2.0  NA 
13 stream -4 NA NA 3.0  NA 
14 stream -6  4 NA 4.0  NA 

모든 사람들이이 개선 또는 최종 dataframe에가는 길에 일어났다 단계를 교정 작업을 돕기 위해, 여기에 dataframe는 중간 단계의 포함 : 경계 문제에 대한

# A tibble: 14 x 12 
# Groups: site [3] 
     site depth var1 var2  var1_c var2_c var1_min var2_min var1_max var2_max var1_i var2_i 
    <fctr> <int> <int> <int>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1 wetland  0 NA  1 -7.5714286 1.000000  1  1  6  8  NA 1.000000 
2 wetland -3  1 NA 1.0000000 3.078125  1  1  6  8 1.0 3.078125 
3 wetland -4  3  3 3.0000000 3.000000  1  1  6  8 3.0 3.000000 
4 wetland -8 NA  4 6.7142857 4.000000  1  1  6  8  NA 4.000000 
5 wetland -10  6  8 6.0000000 8.000000  1  1  6  8 6.0 8.000000 
6 wetland -14 NA NA -0.5714286 30.750000  1  1  6  8  NA  NA 
7 lake  0  1 NA 1.0000000  NA  1  Inf  4  -Inf 1.0  NA 
8 lake -1  2 NA 2.0000000  NA  1  Inf  4  -Inf 2.0  NA 
9 lake -3 NA NA 3.4000000  NA  1  Inf  4  -Inf 3.4  NA 
10 lake -5  4 NA 4.0000000  NA  1  Inf  4  -Inf 4.0  NA 
11 stream  0  1 NA 1.0000000  NA  1  2  4  2 1.0  NA 
12 stream -2 NA  2 2.0000000  NA  1  2  4  2 2.0  NA 
13 stream -4 NA NA 3.0000000  NA  1  2  4  2 3.0  NA 
14 stream -6  4 NA 4.0000000  NA  1  2  4  2 4.0  NA 
관련 문제