You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中扩展包含起止年份区间的数据框?

嘿,我来帮你搞定这个扩展时间范围数据框的问题!首先先确认你的原始数据:

test <- data.frame(id = c("a","b"),start = c(2002,2004), end = c(2005,2007))

你之前用sapply失败主要有两个小问题:一是sapply会默认简化输出结构,二是函数里的id没有正确引用每行的对应值,而且还少了个+1(毕竟要包含start和end两个年份)。不过没关系,我给你几个靠谱的解决方案:

方法1:dplyr + tidyr组合(最直观推荐)

用map2给每行生成对应的年份序列,再用unnest_longer展开成多行,最后保留需要的列就行:

library(dplyr)
library(tidyr)

test %>%
  mutate(year = map2(start, end, `:`)) %>%  # 给每个id生成start到end的年份向量
  unnest_longer(year) %>%  # 把向量拆成单独的行
  select(id, year)  # 只保留需要的两列

运行后就能得到你想要的结果:

# A tibble: 8 × 2
  id    year
  <chr> <int>
1 a     2002
2 a     2003
3 a     2004
4 a     2005
5 b     2004
6 b     2005
7 b     2006
8 b     2007

方法2:修正你的Base R思路

如果你不想加载额外包,调整下你的代码就能用:把sapply换成lapply(它不会自动简化结果),然后正确引用每行的id和计算行数,最后合并所有子数据框:

result_list <- lapply(1:nrow(test), function(i) {
  current_row <- test[i, ]
  data.frame(
    id = rep(current_row$id, current_row$end - current_row$start + 1),
    year = current_row$start:current_row$end
  )
})

final_result <- do.call(rbind, result_list)

这样就能得到和上面一样的8条观测数据啦。

方法3:data.table一行流(大数据高效选择)

如果你处理的是大规模数据,data.table的方法会更高效,一行代码就能搞定:

library(data.table)
setDT(test)[, .(year = start:end), by = id]

内容的提问来源于stack exchange,提问作者bshor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:06:28