按组用同一列中的另一个值替换值

时间:2018-10-31 21:26:31

标签: r if-statement dplyr

我下面有一个数据集:

       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  

1 个答案:

答案 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创建