Подмножество на основе дублированного идентификатора и, если значение является дубликатом значения в другом столбце следующей строки - PullRequest
0 голосов
/ 25 октября 2018

У меня есть data.frame df, который выглядит примерно так

ID      VALUE_1   VALUE_2   VALUE_3
Pete      55        52         53
Amber     23        33         47
Amber     47        25         69
Bob       34        25         52
Bob       52        78         93
Bob       93        11         83
Alfie     24        75         52
Alfie     13        64         32

Меня интересует подмножество, сохраняющее только дубликаты с точки зрения имен, и если VALUE_3 равно / дублируется последующемуVALUE_1 с выводом результата:

ID      VALUE_1   VALUE_2   VALUE_3
Amber     23        33         47
Amber     47        25         69
Bob       34        25         52
Bob       52        78         93
Bob       93        11         83

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 25 октября 2018

Вот идея использования tidyverse.Мы группируем по ID и удаляем все группы только с 1 наблюдением.Затем мы создаем логический столбец со значениями_3, равными следующим значениям_1.Затем мы используем fill для заполнения оператора и используем эту переменную для фильтрации

library(tidyverse)

df %>% 
 group_by(ID) %>% 
 filter(n() > 1) %>% 
 mutate(new = VALUE_3 == lead(VALUE_1)) %>% 
 fill(new) %>% 
 filter(new) %>% 
 ungroup() %>% 
 select(-new)

, что дает

# A tibble: 5 x 4
  ID    VALUE_1 VALUE_2 VALUE_3
  <fct>   <int>   <int>   <int>
1 Amber      23      33      47
2 Amber      47      25      69
3 Bob        34      25      52
4 Bob        52      78      93
5 Bob        93      11      83

Пара data.tableспособы достижения вышеуказанного (комплименты @akrun и @Frank)

library(data.table)

setDT(df)[, .SD[cummax(.N >1 & VALUE_3 == shift(VALUE_1, type = 'lead', fill = last(VALUE_1))) > 0], ID]  -- #akrun

w = DF[VALUE_1 == shift(VALUE_3) & ID == shift(ID), which = TRUE] 
DF[unique(sort(c(w, w-1)))] -- #Frank
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...