制作每个组的前4次观察切断的子集

时间:2014-12-02 16:23:58

标签: r

df <- read.table(header=TRUE, text=" firm year     inv   value capital
1      1 1935  317.60 3078.50    2.80
2      1 1936  391.80 4661.70   52.60
3      1 1937  410.60 5387.10  156.90
4      1 1938  257.70 2792.20  209.20
5      1 1939  330.80 4313.20  203.40
6      1 1940  461.20 4643.90  207.20
7      1 1941  512.00 4551.20  255.20
8      1 1942  448.00 3244.10  303.70
9      2 1936  355.30 1807.10   50.50
10     2 1937  469.90 2676.30  118.10
11     2 1938  262.30 1801.90  260.20
12     3 1935   33.10 1170.60   97.80
13     4 1935   40.29  417.50   10.50
14     4 1936   72.76  837.80   10.20
15     4 1937   66.26  883.90   34.70
16     4 1938   51.60  437.90   51.80
17     4 1939   52.41  679.70   64.30")

我昨天使用了相同的数据集来解决其他问题。现在在制作新数据集之后(新数据集仅包括公司1和4,因为这些公司包含超过4个观察点),我想删除每个公司的4个观察结果。 在这种情况下,公司1有4个观察(1939,1940,1941,1942),公司4有1个观察(1939)。

对于时间序列数据,我们可以使用&#34; window&#34;获得某些年份观察的命令。但是,对于面板数据集,我如何处理时间(年,月,季),尤其是不平衡的面板数据集?

1 个答案:

答案 0 :(得分:2)

假设您希望在对数据集进行子集化后chop off前4次观察,

indx <- with(df, ave(seq_along(firm), firm, FUN=length)>=4)
df1 <- df[indx,]
df1[with(df1, ave(seq_along(firm), firm,  FUN=seq_along)>4),]
#     firm year    inv  value capital
#5     1 1939 330.80 4313.2   203.4
#6     1 1940 461.20 4643.9   207.2
#7     1 1941 512.00 4551.2   255.2
#8     1 1942 448.00 3244.1   303.7
#17    4 1939  52.41  679.7    64.3

或使用data.table

 library(data.table)
 setDT(df)[df[, .I[.N>=4], by=firm]$V1][, tail(.SD,-4), by=firm]
 #     firm year    inv  value capital
 #1:    1 1939 330.80 4313.2   203.4
 #2:    1 1940 461.20 4643.9   207.2
 #3:    1 1941 512.00 4551.2   255.2
 #4:    1 1942 448.00 3244.1   303.7
 #5:    4 1939  52.41  679.7    64.3

或者

 setDT(df)[,.SD[.N>=4 & (1:.N >4)], by=firm]

或使用dplyr

library(dplyr)
 df %>% 
     group_by(firm) %>% 
     filter(n()>=4) %>% 
     slice(-(1:4))
 #     firm year    inv  value capital
 #1    1 1939 330.80 4313.2   203.4
 #2    1 1940 461.20 4643.9   207.2
 #3    1 1941 512.00 4551.2   255.2
 #4    1 1942 448.00 3244.1   303.7
 #5    4 1939  52.41  679.7    64.3

dplyr中的其他选项(由@beginneR提供)

 df %>% 
    group_by(firm) %>% 
    filter(n()>=4 & 1:n() > 4)