跨年份使用 data.table 扩展行

如何解决跨年份使用 data.table 扩展行

我正在寻找 data.table 解决方案来扩展我的数据集以包括缺失的年份,将缺失年份的值分配为零。 在以下示例中:

> df <- data.table(firm = rep(c("A","B"),each=4),year = rep(c(2005,2007,2008,2011),2),var="var")
> df
   firm year var
1:    A 2005 var
2:    A 2007 var
3:    A 2008 var
4:    A 2011 var
5:    B 2005 var
6:    B 2007 var
7:    B 2008 var
8:    B 2011 var

所需的输出解决方案 1)是:

> df
    firm year var
 1:    A 2005 var
 2:    A 2006   0
 3:    A 2007 var
 4:    A 2008 var
 5:    A 2009   0
 6:    A 2010   0
 7:    A 2011 var
 8:    B 2005 var
 9:    B 2006   0
10:    B 2007 var
11:    B 2008 var
12:    B 2009   0
13:    B 2010   0
14:    B 2011 var

此外,有什么方法可以添加不在我的初始数据集中的前几年或下一年,再次将零分配给其他变量。例如,我的初始数据集中的年份范围是 2005-2011 年,假设我想将其扩展到 2003-2012 年,输出如下(解决方案 2):

> df
    firm year var
 1:    A 2003   0
 2:    A 2004   0
 3:    A 2005 var
 4:    A 2006   0
 5:    A 2007 var
 6:    A 2008 var
 7:    A 2009   0
 8:    A 2010   0
 9:    A 2011 var
10:    B 2012   0
11:    B 2003   0
12:    B 2004   0
13:    B 2005 var
14:    B 2006   0
15:    B 2007 var
16:    B 2008 var
17:    B 2009   0
18:    B 2010   0
19:    A 2011 var
20:    A 2012   0

解决方法

您可以使用 expand.grid 生成所有可能的组合:

library(data.table)

all <- data.table(expand.grid(year=2003:2012,firm =unique(df$firm)))

df[all,.(firm,year,var=fifelse(is.na(var),"0",var)),on=.(year=year,firm=firm)]

    firm year var
 1:    A 2003   0
 2:    A 2004   0
 3:    A 2005 var
 4:    A 2006   0
 5:    A 2007 var
 6:    A 2008 var
 7:    A 2009   0
 8:    A 2010   0
 9:    A 2011 var
10:    A 2012   0
11:    B 2003   0
12:    B 2004   0
13:    B 2005 var
14:    B 2006   0
15:    B 2007 var
16:    B 2008 var
17:    B 2009   0
18:    B 2010   0
19:    B 2011 var
20:    B 2012   0
,

如果 tidyverse 是一个选项,这可以在 complete 内使用 nestingfill 作为其参数来完成

df %>% complete(year = 2003:2012,nesting(firm),fill = list(var = 0))

# A tibble: 20 x 3
    year firm  var  
   <dbl> <chr> <chr>
 1  2003 A     0    
 2  2003 B     0    
 3  2004 A     0    
 4  2004 B     0    
 5  2005 A     var  
 6  2005 B     var  
 7  2006 A     0    
 8  2006 B     0    
 9  2007 A     var  
10  2007 B     var  
11  2008 A     var  
12  2008 B     var  
13  2009 A     0    
14  2009 B     0    
15  2010 A     0    
16  2010 B     0    
17  2011 A     var  
18  2011 B     var  
19  2012 A     0    
20  2012 B     0
,

我们可以使用crossing

library(dplyr)
library(tidyr)
crossing(year = 2003:2012,firm = unique(df$firm)) %>%
     left_join(df,by = c('year','firm')) %>%
     mutate(var = ifelse(is.na(var),var))

或者另一个选项是group_by/complete

df %>% 
  group_by(firm) %>%
  complete(year = 2003:2012,fill = list(var = 0)) %>%
  ungroup 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?