我有一个如下所示的数据集:
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))
我不知道如何继续获得代码中描述的预期结果。 在此先感谢您的帮助
答案 0 :(得分:0)
我们可以将Map
与stack
一起使用。通过使用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))