【发布时间】:2017-10-03 14:11:04
【问题描述】:
我想在 data.frame 中为每个组(公司和类型)的所有缺失年份创建新行。数据框如下所示:
minimal <- data.frame(firm = c("A","A","A","B","B","B","A","A","A","B","B","B"),
type = c("X","X","X","X","X","X","Y","Y","Y","Y","Y","Y"),
year = c(2000,2004,2007,2010,2008,2001,2002,2003,2007,2000,2001,2008),
value = c(1,3,7,9,9,2,3,3,7,5,9,15)
)
数据框:
firm type year value
A X 2000 1
A X 2004 3
A X 2007 7
B X 2010 9
B X 2008 9
B X 2001 2
A Y 2002 3
A Y 2003 3
A Y 2007 7
B Y 2000 5
B Y 2001 9
B Y 2008 15
现在,我想要得到的是以下内容: 我可以在数据中看到最小年份是 2000 年,最大年份是 2010 年。我想为每个公司类型组合的每个缺失年份添加一行。 例如。对于公司 A 和类型 X,我想添加如下所示的行:
最终输出:
firm type year value
A X 2000 1
A X 2004 3
A X 2007 7
A X 2001 1
A X 2002 1
A X 2003 1
A X 2005 3
A X 2006 3
A X 2008 7
A X 2009 7
A X 2010 7
此外,我想将前一年的值写入所有后续年份的缺失行的“值”列,直到出现新的非缺失行(如最终输出示例所示)。
我还没有想出任何有用的代码,但到目前为止我发现以下可能是正确的方向:
setDT(minimal)[, .SD[match(2000:2010, year)],
by = c("firm","type")]
我不太了解 setDT 和 .SD 的概念,但这会为每个公司类型组合创建至少一行。但是,没有一年的内容。
提前非常感谢!
【问题讨论】:
-
我认为这有骗局。检查
?complete来自tidyr或?expand.grid来自base R或CJ来自data.table -
好吧,我想出了
min2 <- expand.grid(year = min(minimal$year):max(minimal$year), firm = unique(minimal$firm), type = unique(minimal$type))和merge(min2,minimal, by = c("firm","type","year"), all.x = T)。现在我只需要为每一行添加正确的值,我现在还不知道该怎么做。 -
试试这个:
library(dplyr); library(tidyr); minimal %>% group_by(firm, type) %>% complete(year = full_seq(year, 1)) %>% fill(value) -
很酷,这是非常好的代码。但是,我仍然有每个组(公司,类型)需要最短和最长年份的问题。我实际上需要总最小值和最大值,这通常与组最小值和最大值不同。
-
好吧,就是
year = full_seq(2000:2010,1)。谢谢!