Как заменить подкадр данных именами строк, которые не соответствуют условию? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть фрейм данных, который состоит из имен и дат.Я хочу подставить фрейм данных именами, которые не появляются в течение 3 лет подряд.Вот мой фрейм данных:

data <- data.frame( Name = c("Dex","Dex","Rex","Rex","Rex","Lex","Lex", "Nex","Nex","Nex"), Year = c(2000, 2001, 2000, 2001, 2002, 2001, 2002, 2000, 2001, 2002 ))

Name Year Dex 2000 Dex 2001 Rex 2000 Rex 2001 Rex 2002 Lex 2001 Lex 2002 Nex 2000 Nex 2001 Nex 2002

Это желаемый вывод:

Name Year Dex 2000 Dex 2001 Lex 2001 Lex 2002

Есть ли способ поднабора данных в соответствии с условиями, которые не выполняются?

1 Ответ

0 голосов
/ 13 февраля 2019

В этом примере «Год» для всех уникальных «Имен» является последовательным.Таким образом, более простой вариант - сгруппировать по «Имени» и filter, если число различных «Год» меньше 3 или количество строк (n()) меньше 3

library(dplyr)
data %>%
   group_by(Name) %>% 
   filter(n_distinct(Year) < 3)
   #or the number of rows
   # filter(n() < 3)
# A tibble: 4 x 2
# Groups:   Name [2]
#  Name   Year
#  <fct> <dbl>
#1 Dex    2000
#2 Dex    2001
#3 Lex    2001
#4 Lex    2002

Как правило, после группировки по «Имени» мы получаем diff отношение соседнего «Года», проверяем, равно ли оно 1, то есть разнице в 1 год, используйте это в кодировке длин серий(rle), чтобы найти max imum длина последовательности последовательных 'year' меньше чем от 3 до filter этих групп 'Name'

data %>%
   group_by(Name) %>% 
   filter(with(rle(c(TRUE, diff(Year)) == 1), max(lengths[values])) < 3)
# A tibble: 4 x 2
# Groups:   Name [2]
#  Name   Year
#  <fct> <dbl>
#1 Dex    2000
#2 Dex    2001
#3 Lex    2001
#4 Lex    2002
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...