如何在两栏适用条件下填充另一栏
问题描述:
我试图执行一个非常简单的数据填写:我有两列相同的测量数据,这两个数据栏位于相距几英里的两个不同位置。位置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
非常感谢!我的第三颗子弹的意思是用日期和loc1来完成缺失的系数,并尽可能地提供最接近的值。 在我的示例中取第4行或第5行:没有类似的loc1值,没有类似的Date值。因此,我将采用第2行的系数,因为8是loc1中最接近10的值,例如,147比147更接近147,而158比204更接近。 但是,这会导致很多问题的选择限制,你有多么不同容忍loc1,或者如果有几种可能性。所以你的方法与平均loc1采用! –
太棒了,很高兴这有帮助! – austensen