首页 > 解决方案 > 按组将值替换为同一列中的另一个值

问题描述

我在下面有一个数据集:

       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替换为 Date 2015-03-02by group 的值。

预期输出:

       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  

标签: rif-statementdplyr

解决方案


这是使用 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 包(v0.2.1)于 2018 年 10 月 31 日创建


推荐阅读