如何根据应用于两列的条件用另一列填充列
How to fill column with another on conditions applied on both columns
我正在尝试执行一个非常简单的数据完成:我在相距几英里的两个不同位置进行了两列相同的测量。位置 1 比位置 2 更完整,我想通过对 1 应用系数 (loc1/loc2) 来完成第二个与第一个。
我的问题是它与天气值有关,天气值随考虑的日期而变化,因此对我的所有值应用相同的平均系数并不理想。我首先通过 loc1 和日期的值获得平均系数,但是对于没有 loc2 值的日期,我想:
- 将 'coef' 值中的 NA 替换为使用相同 loc1 值
计算的系数
- 但有时每个loc1值的coef不止一个,所以当不止一个时,优先选择当天测得的那个
并且当一个 loc1 值根本没有 coef 值时,coef 将与该 loc1 值相同 +/- 一个区间(最近的 loc1 值的 coef离完成日期最近的日期)
这是它的样子:
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 中的确切含义:
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
我正在尝试执行一个非常简单的数据完成:我在相距几英里的两个不同位置进行了两列相同的测量。位置 1 比位置 2 更完整,我想通过对 1 应用系数 (loc1/loc2) 来完成第二个与第一个。
我的问题是它与天气值有关,天气值随考虑的日期而变化,因此对我的所有值应用相同的平均系数并不理想。我首先通过 loc1 和日期的值获得平均系数,但是对于没有 loc2 值的日期,我想:
- 将 'coef' 值中的 NA 替换为使用相同 loc1 值 计算的系数
- 但有时每个loc1值的coef不止一个,所以当不止一个时,优先选择当天测得的那个
并且当一个 loc1 值根本没有 coef 值时,coef 将与该 loc1 值相同 +/- 一个区间(最近的 loc1 值的 coef离完成日期最近的日期) 这是它的样子:
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 中的确切含义:
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