如何在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
相关产品推荐
相关产品推荐

