如何根据应用于两列的条件用另一列填充列

How to fill column with another on conditions applied on both columns

我正在尝试执行一个非常简单的数据完成:我在相距几英里的两个不同位置进行了两列相同的测量。位置 1 比位置 2 更完整,我想通过对 1 应用系数 (loc1/loc2) 来完成第二个与第一个。

我的问题是它与天气值有关,天气值随考虑的日期而变化,因此对我的所有值应用相同的平均系数并不理想。我首先通过 loc1 和日期的值获得平均系数,但是对于没有 loc2 值的日期,我想:

我很确定有一种简单的方法可以做到这一点,但是由于我对 ifelse 或 ddply 的了解有限,我最终没有更接近我想要的东西。我觉得一个循环可以解决问题,但我不知道如何..

如有任何想法,我们将不胜感激!非常感谢!

我不明白你在项目符号 3 中的确切含义:

when there is no coef value at all for one loc1 value, then coef would be the same than for that loc1 value +/- an interval (the coef of the closest loc1 value on the closest date to the one to be completed)

所以我没有那个部分的答案,但这可能会帮助你:


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