如何在两栏适用条件下填充另一栏

问题描述:

我试图执行一个非常简单的数据填写:我有两列相同的测量数据,这两个数据栏位于相距几英里的两个不同位置。位置1比位置2更完整,并且我想通过将系数(loc1/loc2)应用于1来完成第二个。我的问题是它是关于天气值,随着一天考虑,所以对我的所有数值应用相同的平均系数并不理想。我首先LOC1和当天的值了平均系数,但对于没有LOC2值的日子里,我想:如何在两栏适用条件下填充另一栏

  • 通过用相同LOC1值计算COEF代替NA在“COEF的价值
  • ,但有一段时间超过一个COEF每个LOC1值,所以当有不止一个,这将是优先于当日测得的一个
  • ,并在没有COEF价值可言了一个loc1值,则coef将与该loc1值+/-一个区间(最接近要完成的最接近的日期的loc1值的系数)相同。 下面是它的样子:

    loc1 Date  Coef loc2 
    1  12 204  3  4 
    2  8 147  4  2 
    3  8 204  NA NA 
    4  10 147  NA NA 
    5  10 158  NA NA 
    6  6 159  3  2 
    7  6 162  NA NA 
    8  6 170  2  3 
    9  .3 175 0.4833333 0.145 
    10  0.3 204  NA NA 
    11  0.4 146  NA NA 
    12  0.4 147  NA NA 
    

我敢肯定有这样做的一个非混乱的方式,而是用我有限的知识使用ifelse或ddply,我没有得到任何接近我想要的到底。我觉得循环可以做到这一点,但我不知道如何......

任何想法将不胜感激!提前谢谢了 !

我完全不明白你在弹头3的意思:

当没有COEF价值可言了一个LOC1值,那么COEF会比那LOC1值相同+/-一个区间(距离要完成的最接近的日期的最接近的loc1值的系数)

所以我没有对该部分的答案,但是这可能会让你有一些方法:


library(dplyr) 

df <- tibble::tribble(
    ~loc1, ~Date,  ~Coef, ~loc2, 
    12, 204L,   3,  4, 
    8, 147L,   4,  2, 
    8, 204L,  NA, NA, 
    10, 147L,  NA, NA, 
    10, 158L,  NA, NA, 
    6, 159L,   3,  2, 
    6, 162L,  NA, NA, 
    6, 170L,   2,  3, 
    3, 175L, 0.4833333, 0.145, 
    0.3, 204L,  NA, NA, 
    0.4, 146L,  NA, NA, 
    0.4, 147L,  NA, NA 
) 

df %>% 
    # Replace Coef with the coef of same loc1 and same day 
    group_by(loc1, Date) %>% 
    mutate(Coef = if_else(!is.finite(Coef), mean(Coef, na.rm = TRUE), Coef)) %>% 
    # For ones without same day and loc1, use the average of all days at loc1 
    group_by(loc1) %>% 
    mutate(Coef = if_else(!is.finite(Coef), mean(Coef, na.rm = TRUE), Coef)) %>% 
    ungroup() %>% 
    # Then complete the loc2 with using the completed Coef and loc1 
    mutate(loc2 = if_else(!is.finite(loc2), loc1 * Coef, loc2)) 

#> # A tibble: 12 x 4 
#>  loc1 Date  Coef loc2 
#> <dbl> <int>  <dbl> <dbl> 
#> 1 12.0 204 3.0000000 4.000 
#> 2 8.0 147 4.0000000 2.000 
#> 3 8.0 204 4.0000000 32.000 
#> 4 10.0 147  NaN NaN 
#> 5 10.0 158  NaN NaN 
#> 6 6.0 159 3.0000000 2.000 
#> 7 6.0 162 2.5000000 15.000 
#> 8 6.0 170 2.0000000 3.000 
#> 9 3.0 175 0.4833333 0.145 
#> 10 0.3 204  NaN NaN 
#> 11 0.4 146  NaN NaN 
#> 12 0.4 147  NaN NaN 
+0

非常感谢!我的第三颗子弹的意思是用日期和loc1来完成缺失的系数,并尽可能地提供最接近的值。 在我的示例中取第4行或第5行:没有类似的loc1值,没有类似的Date值。因此,我将采用第2行的系数,因为8是loc1中最接近10的值,例如,147比147更接近147,而158比204更接近。 但是,这会导致很多问题的选择限制,你有多么不同容忍loc1,或者如果有几种可能性。所以你的方法与平均loc1采用! –

+0

太棒了,很高兴这有帮助! – austensen