如何确定日期范围内的唯一年份?Excel/R实现方法求助
当然可以!不管用Excel还是R都能轻松搞定这个需求,我给你分两种方法详细说明:
在Excel中实现
假设你的数据在A1:C5区域(A列是Clientnumber,B列是Date start,C列是Date end),按以下步骤操作:
提取时间段的起止年份:
在D2单元格输入=YEAR(B2),E2输入=YEAR(C2),下拉填充到D5和E5,得到每行的开始年份和结束年份。生成每个时间段覆盖的所有年份:
在F2单元格输入以下公式(适用于Excel 365/2021及以上版本):=IF(D2=E2, D2, SEQUENCE(E2-D2+1,,D2))下拉填充后,每个行会生成对应的年份序列(比如第四行开始是2019、结束是2020,就会生成2019、2020两个值)。
合并所有年份并去重:
在任意空白单元格(比如G2)输入:=UNIQUE(TOCOL(F2:F5, TRUE))这个公式会把F列的所有年份合并成一个列表,自动去重后得到你想要的唯一注册年份:2017,2018,2019,2020。
计算唯一年份的计数:
在旁边单元格输入:=ROWS(G2:G5)或者直接嵌套公式一步到位:
=ROWS(UNIQUE(TOCOL(F2:F5, TRUE)))就能得到计数结果:4。
如果你用的是旧版Excel(没有
SEQUENCE和TOCOL函数),可以用数组公式生成年份序列,在F2输入后按Ctrl+Shift+Enter确认:=IF(D2=E2, D2, ROW(INDIRECT(D2&":"&E2)))后续去重可以用
INDEX+MATCH组合来实现。
在R中实现
我们可以用基础R或者tidyverse工具包来处理,两种方式都很便捷:
方式一:基础R实现
先把数据读入R中,再逐步处理:
# 构造数据框 client_data <- data.frame( Clientnumber = c(1, 1, 1, 1), Date_start = as.Date(c("01-03-2017", "01-02-2018", "01-11-2018", "25-03-2019"), format = "%d-%m-%Y"), Date_end = as.Date(c("31-10-2017", "07-08-2018", "01-03-2019", "01-07-2020"), format = "%d-%m-%Y") ) # 生成所有覆盖的年份 all_years <- unlist(apply(client_data, 1, function(row) { start_year <- as.integer(format(row["Date_start"], "%Y")) end_year <- as.integer(format(row["Date_end"], "%Y")) # 生成从开始到结束的年份序列 start_year:end_year })) # 获取唯一的年份并排序 unique_years <- sort(unique(all_years)) # 计算年份计数 year_count <- length(unique_years) # 查看结果 unique_years # 输出:2017 2018 2019 2020 year_count # 输出:4
方式二:tidyverse工具包实现(更简洁)
如果你习惯用tidyverse的语法,代码会更直观易读:
library(tidyverse) # 处理数据 result <- client_data |> rowwise() |> # 为每行生成覆盖的年份列表 mutate(years = list(year(Date_start):year(Date_end))) |> # 展开列表为单独的行 unnest(years) |> # 提取唯一的年份并排序 distinct(years) |> arrange(years) # 获取唯一的年份和计数 unique_years <- result$years year_count <- nrow(result) # 查看结果 unique_years # 输出:2017 2018 2019 2020 year_count # 输出:4
内容的提问来源于stack exchange,提问作者E. van Dongen
相关产品推荐
相关产品推荐

