我有一个包含名称和日期的数据框。我希望通过连续三年不出现的名称来对数据框进行子集化。这是我的数据框:
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
是否有一种方法可以根据不满足的条件对数据进行子集化?
答案 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