制作新的数据集,该数据集基于每组中按年观察的数量

时间:2014-12-01 20:36:49

标签: r

    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应该被删除。

如何使用子命令并创建新数据集。

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")