Замените значение другим значением в том же столбце по группам - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть набор данных ниже:

       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-02 by 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  

1 Ответ

0 голосов
/ 01 ноября 2018

Вот решение с использованием 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...