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;获得某些年份观察的命令。但是,对于面板数据集,我如何处理时间(年,月,季),尤其是不平衡的面板数据集?
答案 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)