Q-按条件(两个时间段)展开数据集并填充新列(两个时间段之间的时间)

时间:2017-01-25 16:06:04

标签: r dataframe dplyr tidyverse

我有一个如下所示的数据集:

 o<- data.frame(country = c("US", "Mexico"), start = c(1972, 1982), end= c(1975, 1986)) 

我想根据年数展开数据集,并重新整形数据集,所以最后我可以这样:

a<- seq(1972, 1975, 1)
b<- seq(1982, 1986, 1)
on<-data.frame(country = c(rep("US", 4),rep("Mexico", 5)), year = c(a,b))

我不知道如何继续获得代码中描述的预期结果。 在此先感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我们可以将Mapstack一起使用。通过使用Map,我们将“start”的每个值的序列添加到相应的“end”,然后将list输出的名称设置为country列并转换{{ 1}}到list

的两列data.frame
stack

更新

如果还有其他列,那么我们可以通过res <- stack(setNames(Map(`:`, o$start, o$end), o$country))[2:1] colnames(res) <- c("country", "year") all.equal(res, on) #[1] TRUE 获取list来改变方法略有不同,然后使用Map查找lengths每个length元素,使用该元素复制数据集的行,最后list cbind编辑unlist输出为'年'

list

答案 1 :(得分:0)

使用 tidyr 函数,您可以先将gather数据集转换为长格式,然后对按国家/地区分组的数据集使用complete来填写每个国家/地区的年份。

dplyr::select用于删除表示“开始”和“结束”分组的额外变量。

library(tidyr)

gather(o, time, years, -country) %>%
    dplyr::select(-time) %>%
    dplyr::group_by(country) %>%
    complete(years = full_seq(years, period = 1))