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
我想制作新数据集,其中包括每家公司多年来至少有4次观察,因为我将在回归中使用1~4滞后。 在这种情况下,公司1和公司4用于新数据集,公司2和3应该被删除。
如何使用子命令并创建新数据集。
答案 0 :(得分:4)
或使用data.table
library(data.table)
setDT(df)[, .SD[.N >= 4L], firm]
# firm year inv value capital
# 1: 1 1935 317.60 3078.5 2.8
# 2: 1 1936 391.80 4661.7 52.6
# 3: 1 1937 410.60 5387.1 156.9
# 4: 1 1938 257.70 2792.2 209.2
# 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
# 9: 4 1935 40.29 417.5 10.5
# 10: 4 1936 72.76 837.8 10.2
# 11: 4 1937 66.26 883.9 34.7
# 12: 4 1938 51.60 437.9 51.8
# 13: 4 1939 52.41 679.7 64.3
对于大数据集,二进制搜索可能很有用
setkey(setDT(df)[, indx := .N >= 4L, firm], indx)[J(TRUE)]
或者只是
setDT(df)[df[, indx := .N >= 4L, firm]$indx]
或(正如@Arun所指出的) - 这似乎是最好的
setDT(df)[, if(.N >= 4L) .SD, by = firm]
答案 1 :(得分:2)
如果您希望将具有4个或更多观察结果的所有公司分组,您可以这样做:
df[ave(df$firm, df$firm, FUN = length) >= 4,]
# firm year inv value capital
#1 1 1935 317.60 3078.5 2.8
#2 1 1936 391.80 4661.7 52.6
#3 1 1937 410.60 5387.1 156.9
#4 1 1938 257.70 2792.2 209.2
#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
#13 4 1935 40.29 417.5 10.5
#14 4 1936 72.76 837.8 10.2
#15 4 1937 66.26 883.9 34.7
#16 4 1938 51.60 437.9 51.8
#17 4 1939 52.41 679.7 64.3
或者使用dplyr:
library(dplyr)
group_by(df, firm) %>% filter(n() >= 4)
答案 2 :(得分:2)
使用table()
和简单子集的解决方案:
z <- table(dat$firm)
idx <- names(z)[z>=4]
with(dat, dat[firm %in% idx, ])
结果:
firm year inv value capital
1 1 1935 317.60 3078.5 2.8
2 1 1936 391.80 4661.7 52.6
3 1 1937 410.60 5387.1 156.9
4 1 1938 257.70 2792.2 209.2
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
13 4 1935 40.29 417.5 10.5
14 4 1936 72.76 837.8 10.2
15 4 1937 66.26 883.9 34.7
16 4 1938 51.60 437.9 51.8
17 4 1939 52.41 679.7 64.3
PS。要从问题中重新创建数据:
dat <- 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")