Фильтруйте набор данных, чтобы отображались только те программы, которые были организованы раньше - PullRequest
1 голос
/ 06 июня 2019

Представьте себе следующий набор данных (tabel = DT)

ID    Program   Year
ABC   xxx       2000
ABC   yyy       2001
ABC   zzz       2002
DEF   xxx       2000
DEF   zzz       2001
DEF   yyy       2002

Я хочу отфильтровать таблицу, чтобы отображались ТОЛЬКО программы с УНИКАЛЬНЫМ ИД, которые были организованы раньше или в том же году, что и выбранная программа (например, выбор = ггг)

В этом случае - при выборе программы yyy - это даст следующий вывод

ID    Program   Year
ABC   xxx       2000
ABC   yyy       2001
DEF   xxx       2000
DEF   zzz       2001
DEF   yyy       2002

У кого-нибудь есть идеи по использованию R-кода?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Используя dplyr, вы можете group_by ID и найти индекс, где Program == "yyy" получает соответствующие Year и filter строки, которые на Year меньше извлеченной.

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(Year <= Year[which.max(Program == "yyy")])


#  ID    Program  Year
#  <fct> <fct>   <int>
#1 ABC   xxx      2000
#2 ABC   yyy      2001
#3 DEF   xxx      2000
#4 DEF   zzz      2001
#5 DEF   yyy      2002
0 голосов
/ 06 июня 2019

Мы можем использовать slice после группировки по 'ID'

library(dplyr)
df %>%
   group_by(ID) %>%
   slice(which(Year <= Year[match("yyy", Program)]))
# A tibble: 5 x 3
# Groups:   ID [2]
#  ID    Program  Year
#  <chr> <chr>   <int>
#1 ABC   xxx      2000
#2 ABC   yyy      2001
#3 DEF   xxx      2000
#4 DEF   zzz      2001
#5 DEF   yyy      2002

или используя data.table

library(data.table)
setDT(df)[, .SD[Year <= Year[match("yyy", Program)]], ID]

data

df <- structure(list(ID = c("ABC", "ABC", "ABC", "DEF", "DEF", "DEF"
), Program = c("xxx", "yyy", "zzz", "xxx", "zzz", "yyy"), Year = c(2000L, 
2001L, 2002L, 2000L, 2001L, 2002L)), class = "data.frame", row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...