如何按不符合条件的行名对数据帧进行子集化?

时间:2019-02-13 03:08:41

标签: r

我有一个包含名称和日期的数据框。我希望通过连续三年不出现的名称来对数据框进行子集化。这是我的数据框:

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 :(得分:0)

在示例中,所有唯一“名称”的“年份”是连续的。因此,如果不同的“ Year”(年份)少于3个或行数(filter)少于3个,则更简单的选择是按“ Name”和n()分组

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那些“名称”组中连续{year的序列的最大长度小于filter

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