在R中子集面板数据

时间:2014-07-21 17:08:41

标签: r subset panel-data

我正在尝试将面板数据集子集化,以便只读取每个“Region”的前855个观测值。区域列有65个不同的区域,每个区域有1070个观测值。从这里,我想减少数据集以包含所有65个区域,但只有它们的前855个观测值(相应地减少每个其他变量)。

     Region       Week       VolSales  UnitSales BaseVol  BaseUnits 
1065 Los Angeles 02/01/2011    2004.80  2166.18   1921.53  1934.84         
1066 Los Angeles 02/01/2011    1949.03  1479.03   1700.07  1700.07           
1067 Los Angeles 02/01/2011    5231.11  5904.96   4846.51  4811.38           
1068 Los Angeles 02/01/2011    6267.45  6524.85   4675.77  4328.05           
1069 Los Angeles 02/01/2011    2317.29  2180.61   1795.83  1019.11           
1070 Los Angeles 02/01/2011    3433.70  3493.10   1729.77  2179.09       

我能得到的最接近的是用一个新变量为每个区域定义数据,然后对其进行子集化,如下所示:

R1 <- subset(data, data$Region == "Los Angeles")
R2 <- subset(data, data$Region == "Chicago")

等...... 然后采取

Sample1 <- R1[1:855]
Sample2 <- R2[1:855]

然后将其组合以形成整个数据集并根据区域排列(按照原始数据集中的排列)

FinalDataset <- cbind(Sample1,Sample2

但是,当然,这不是一种有效的方式,我期待得到一些更有效的帮助。我希望我能正确解释这个问题。

2 个答案:

答案 0 :(得分:4)

使用基础R的解决方案:

List = by(data, data$Region, function(x) x[1:855,])

FinalDataset = do.call('rbind', List)

如果您想使用data.table包:

data = data.table(data)
FinalDataset = data[,.SD[1:855],by=Region]

答案 1 :(得分:1)

使用dplyr

library(dplyr)
 data %>% 
 group_by(Region) %>% 
 do(head(., n=855))

实施例

 set.seed(24)
 data <- data.frame(Region=rep(c("Los Angeles", "Chicago"),each=10), Value=rnorm(20),stringsAsFactors=F)

 data%>% group_by(Region) %>% do(head(., n=2))
 #Source: local data frame [4 x 2]
  #Groups: Region
  #
  #       Region      Value
 #1      Chicago -1.3169081
 #2      Chicago  0.5982691
 #3  Los Angeles -0.5458808
 #4  Los Angeles  0.5365853