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

