Условная фильтрация значений - PullRequest
0 голосов
/ 05 октября 2018

Пример данных

library(dplyr)
df <- data.frame(
  ID = c(1,1,1,1,2,2,2,3,3,3),
  day = c(3,8,14,29,4,6,8,1,4,9),
  value = c(75, 101, 115, 120, 110, 106, 122, 100, 128, 140))

Идея вопроса:

Выберите наименьшее день для каждого ID субъекта и умножить функцию значение на 1,3 (ID 1 - день 3 - значение 75, ID 2 - день 4 - значение 110, ID 3 - день 1 - значение 100).Затем сравните это вновь созданное значение с другими значениями , которые имеют тот же ID , но имеют другое число .

Например:

Наименьшее день число для ID 1 равно 3. Затем умножьте значение этой строки на 1,3 (75 * 1,3 = 97,5).Сравните вновь созданное значение (97,5) со значениями ((101, 115, 120)), которые имеют тот же ID из 1. Затем введите TRUE илиFALSE, если новое значение больше значения ((101, 115, 120)).

Повторите это также для ID 2 и 3.

1 Ответ

0 голосов
/ 05 октября 2018
library(dplyr)

df <- data.frame(
  ID = c(1,1,1,1,2,2,2,3,3,3),
  day = c(3,8,14,29,4,6,8,1,4,9),
  value = c(75, 101, 115, 120, 110, 106, 122, 100, 128, 140))

df %>%
  group_by(ID) %>%
  mutate(v = value[day == min(day)] * 1.3,
         flag = value > v) %>%
  ungroup()

# # A tibble: 10 x 5
#      ID   day value     v flag 
#   <dbl> <dbl> <dbl> <dbl> <lgl>
# 1     1     3    75  97.5 FALSE
# 2     1     8   101  97.5 TRUE 
# 3     1    14   115  97.5 TRUE 
# 4     1    29   120  97.5 TRUE 
# 5     2     4   110 143   FALSE
# 6     2     6   106 143   FALSE
# 7     2     8   122 143   FALSE
# 8     3     1   100 130   FALSE
# 9     3     4   128 130   FALSE
#10     3     9   140 130   TRUE 

Если вы хотите пометить ID s хотя бы одним TRUE flag, вы можете создать flag2 следующим образом:

 df %>%
  group_by(ID) %>%
  mutate(v = value[day == min(day)] * 1.3,
         flag = value > v,
         flag2 = max(flag)) %>%
  ungroup()

# # A tibble: 10 x 6
#      ID   day value     v flag  flag2
#   <dbl> <dbl> <dbl> <dbl> <lgl> <int>
# 1     1     3    75  97.5 FALSE     1
# 2     1     8   101  97.5 TRUE      1
# 3     1    14   115  97.5 TRUE      1
# 4     1    29   120  97.5 TRUE      1
# 5     2     4   110 143   FALSE     0
# 6     2     6   106 143   FALSE     0
# 7     2     8   122 143   FALSE     0
# 8     3     1   100 130   FALSE     1
# 9     3     4   128 130   FALSE     1
#10     3     9   140 130   TRUE      1

Или извлечь ID sкак вектор:

df %>%
  group_by(ID) %>%
  mutate(v = value[day == min(day)] * 1.3,
         flag = value > v) %>%
  ungroup() -> df2

df2 %>% 
  filter(flag == TRUE) %>%
  distinct(ID) %>%
  pull(ID)

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