Вот решение с использованием Tidyverse. Идея состоит в том, чтобы создать еще один фрейм данных заменяющих значений. Я сделал это, отфильтровав только 2 марта (так как эти значения вы хотите использовать). Затем я присоединяю это к исходному фрейму данных. Оттуда вы можете использовать case_when
, чтобы сказать, что если дата 15 февраля и доступно новое значение, используйте его, в противном случае используйте исходное значение.
library(tidyverse)
df <- data_frame(
Date = c("2015-02-15", "2015-02-32", "2015-03-02", "2015-02-15",
"2015-02-23", "2015-02-15", "2015-03-02"),
Group = c("A", "A", "A", "B", "B", "C", "C"),
Value = c(10, 422, 89, 32, 11, 30, 2)
)
df
#> # A tibble: 7 x 3
#> Date Group Value
#> <chr> <chr> <dbl>
#> 1 2015-02-15 A 10
#> 2 2015-02-32 A 422
#> 3 2015-03-02 A 89
#> 4 2015-02-15 B 32
#> 5 2015-02-23 B 11
#> 6 2015-02-15 C 30
#> 7 2015-03-02 C 2
replace_values <- df %>%
filter(Date == "2015-03-02") %>%
select(Group, new_value = Value)
replace_values
#> # A tibble: 2 x 2
#> Group new_value
#> <chr> <dbl>
#> 1 A 89
#> 2 C 2
df %>%
group_by(Group) %>%
left_join(replace_values, by = "Group") %>%
mutate(
Value = case_when(
Date == "2015-02-15" & !is.na(new_value) ~ new_value,
TRUE ~ Value
)
) %>%
select(-new_value)
#> # A tibble: 7 x 3
#> # Groups: Group [3]
#> Date Group Value
#> <chr> <chr> <dbl>
#> 1 2015-02-15 A 89
#> 2 2015-02-32 A 422
#> 3 2015-03-02 A 89
#> 4 2015-02-15 B 32
#> 5 2015-02-23 B 11
#> 6 2015-02-15 C 2
#> 7 2015-03-02 C 2
Создано в 2018-10-31 пакетом представ. (v0.2.1)