我下面有一个数据集:
Date Group Value
2015-02-15 A 10
2015-02-23 A 422
2015-03-02 A 89
2015-02-15 B 32
2015-02-23 B 11
2015-02-15 C 30
2015-03-02 C 2
我想制定一个规则,对于每个组,如果出现2015-02-15
的值,请按组用日期2015-03-02
的值替换该值。
预期输出:
Date Group Value
2015-02-15 A 89 <----replaced
2015-02-23 A 422
2015-03-02 A 89
2015-02-15 B 32 <----not replaced since 2015-03-02 doesn't exist
2015-02-23 B 11
2015-02-15 C 2 <----replaced
2015-03-02 C 2
答案 0 :(得分:1)
这是使用tidyverse的解决方案。这个想法是创建替换值的另一个数据框。我通过仅过滤到3月2日来完成此操作(因为这些是您要使用的值)。然后,将其加入原始数据框。在此处,您可以使用case_when
来表示,如果日期是2月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
由reprex package(v0.2.1)于2018-10-31创建