我希望选择具有连续的季度记录的标识符。例如,将选择ID 111,因为它具有所有季度。选择ID 113是因为该年-季度组合是连续的,尽管该ID仅占总年-季度的一部分。由于年份季度不是连续的,因此将不会选择ID 112。它缺少201601、201602、201603。
Identifer year-quarter
111 201503
111 201504
111 201601
111 201602
111 201603
111 201604
112 201503
112 201504
112 201604
113 201503
113 201504
113 201601
我当前的代码(如下)只能处理选择具有完整年度-季度组合的ID。我想知道如何实现我想要的结果。
df2 = group_by(df1, Identifer) %>% summarize(total = n()) %>% filter(total =6)
期望的结果是
Identifer
111
113
答案 0 :(得分:2)
要选择“标识符”,请将“ year.quarter”转换为zoo::year.qtr
,按组取连续值之间的差,检查所有差是否均为0.25 *。
library(zoo)
tapply(as.yearqtr(as.character(d$year.quarter), format = "%Y%q"), d$Identifer,
FUN = function(x) all(diff(as.numeric(x)) == 0.25))
# 111 112 113
# TRUE FALSE TRUE
要选择相应的行,请对ave
使用类似的逻辑:
d[as.logical(ave(as.yearqtr(as.character(d$year.quarter), format = "%Y%q"), d$Identifer,
FUN = function(x) all(diff(x) == 0.25))), ]
# Identifer year.quarter
# 1 111 201503
# 2 111 201504
# 3 111 201601
# 4 111 201602
# 5 111 201603
# 6 111 201604
# 10 113 201503
# 11 113 201504
# 12 113 201601
*来自?as.yearqtr
:
“
yearqtr
”类用于表示季度数据。在内部,它保存数据为年份,第一季度为0,第二季度为1/4,依此类推
该帖子通过@ G.Grothendieck的评论得到了改进。谢谢!
答案 1 :(得分:1)
一种方法,我们可以通过同时使用dplyr
和lubridate
来做到这一点。我们可以group_by
Identifier
并使用yq
函数将年季转换为日期,然后取连续日期之间的差,并获得所有日期均在90范围内的所有组。 -120是我们可以允许的四分之一之间的最大天数。
library(dplyr)
library(lubridate)
df %>%
group_by(Identifer) %>%
mutate(yearq = c(90, diff(yq(year.quarter)))) %>%
filter(all(yearq > 89 & yearq < 120)) %>%
select(Identifer) %>%
unique()
# Identifer
# <int>
#1 111
#2 113