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

R语言:将含起止年份的数据框转换为时间序列遇问题

问题:将包含起止年份的数据框转换为时间序列格式

我遇到的问题和Stack Overflow上一篇帖子类似,但其中的解决方案均无效。

我的原始数据框定义如下:

df <- data.frame(country = c("Albania", "Albania", "Albania"), 
                 leader = c("Sali Berisha", "Sali Berisha", "Sali Berisha"), 
                 term = c(2, 2, 2), 
                 yearbegin = c(2009,2009, 2009), 
                 yearend = c(2013, 2013, 2013))

当前数据框内容:

#>    country        leader term yearbegin yearend
#> 1  Albania Sali Berisha    2      2009    2013
#> 2  Albania Sali Berisha    2      2009    2013
#> 3  Albania Sali Berisha    2      2009    2013

我期望得到的输出格式:

#>    country        leader term year
#> 1  Albania Sali Berisha    2 2009
#> 2  Albania Sali Berisha    2 2010
#> 3  Albania Sali Berisha    2 2011
#> 4  Albania Sali Berisha    2 2012
#> 5  Albania Sali Berisha    2 2013

我尝试了以下代码进行转换:

library(tidyverse)
gpd_df <- gpd_df %>% 
  mutate(year = map2(yearbegin, yearend, `:`)) %>% 
  select(-yearbegin, -yearend) %>% 
  unnest

但得到的year列结果是区间形式而非展开的年份:

year
2009:2013
2009:2013
2009:2013

有效解决方法

你的问题核心有两个:一是原始数据存在重复行,二是unnest的用法需要调整。

方法一:先去重再展开年份(推荐)

先去除重复行避免生成冗余数据,再用unnest_longer展开年份序列:

library(tidyverse)

result_df <- df %>%
  distinct() %>% # 去除完全重复的行
  mutate(year = map2(yearbegin, yearend, seq)) %>% # 生成连续年份序列
  select(-yearbegin, -yearend) %>%
  unnest_longer(year) # 将列表列展开为多行

print(result_df)

方法二:base R实现(无需tidyverse)

如果不想用tidyverse工具包,也可以用基础R代码实现:

# 先去重
df_unique <- unique(df)
# 遍历去重后的数据,生成年份序列并合并
result_df <- do.call(rbind, lapply(1:nrow(df_unique), function(i) {
  years <- seq(df_unique$yearbegin[i], df_unique$yearend[i])
  cbind(df_unique[i, c("country", "leader", "term")], year = years)
}))

print(result_df)

运行上述任一方法,都能得到你期望的输出格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:22