1) reshape2 创建一个所有年份的网格g 和id 交叉的值和rbind 它与frame。
然后使用 reshape2 包 cast frame 从长格式到宽格式,然后将 melt 重新转换为长格式。最后根据需要重新排列行和列。
以 # 结尾的行只是为了确保每年都存在,所以如果我们知道是这种情况,可以省略这些行。以## 结尾的行仅用于重新排列行和列,因此如果这无关紧要,也可以省略该行。
library(reshape2)
g <- with(frame, expand.grid(year = seq(min(year), max(year)), id = unique(id), y = 0)) #
frame <- rbind(frame, g) #
wide <- dcast(frame, year ~ id, fill = 0, fun = sum, value.var = "y")
long <- melt(wide, id = "year", variable.name = "id", value.name = "y")
long <- long[order(long$id, long$year), c("id", "year", "y")] ##
给予:
> long
id year y
1 1 2005 1
2 1 2006 0
3 1 2007 0
4 1 2008 0
5 2 2005 0
6 2 2006 0
7 2 2007 0
8 2 2008 0
9 3 2005 0
10 3 2006 0
11 3 2007 0
12 3 2008 0
13 4 2005 0
14 4 2006 0
15 4 2007 1
16 4 2008 0
2) 聚合 一个更短的解决方案是只运行上面以 # 结尾的两行,然后在后面跟着 aggregate ,如图所示。此解决方案不使用插件包。
g <- with(frame, expand.grid(year = seq(min(year), max(year)), id = unique(id), y = 0)) #
frame <- rbind(frame, g) #
aggregate(y ~ year + id, frame, sum)[c("id", "year", "y")]
这给出了与解决方案 (1) 相同的答案,除非上面的评论者解决方案 (1) 指出 id 是一个因素,而它不在此解决方案中。