1)reshape2创建网格越过所有年份和id
值g
与frame
rbind
它。
然后使用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
因子,而它不是在该溶液中。
任何特别的原因重塑在这里?这不够吗? 'merge(frame,g,by = c(“id”,“year”),all = TRUE)'(其中'g'没有'y = 0') – Arun
如果你想能够忽略如果知道所有年份都存在,则计算'g'。 –
我不认为我明白,对不起。在你知道所有年份都存在的情况下,你会在哪里消除'g'的计算? – Arun