Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据各组的观测年数建立新的数据集_R - Fatal编程技术网

R 根据各组的观测年数建立新的数据集

R 根据各组的观测年数建立新的数据集,r,R,我想建立一个新的数据集,其中包括每个公司至少有4年的观测值,因为我将使用1~4个滞后回归。 在这种情况下,固定1和4用于新数据集,固定2和3应删除 如何使用subset命令创建新的数据集。如果您想用4个或更多观察值对所有公司进行子集,可以这样做: 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 193

我想建立一个新的数据集,其中包括每个公司至少有4年的观测值,因为我将使用1~4个滞后回归。 在这种情况下,固定1和4用于新数据集,固定2和3应删除


如何使用subset命令创建新的数据集。

如果您想用4个或更多观察值对所有公司进行子集,可以这样做:

    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
或使用dplyr:

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
使用表格和简单子集的解决方案:

library(dplyr)
group_by(df, firm) %>% filter(n() >= 4)
PS.要从问题中重新创建数据,请执行以下操作:

   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
或者使用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)]
或者正如@Arun所指出的,这似乎是最好的

setDT(df)[df[, indx := .N >= 4L, firm]$indx]

与Andrie的示例并排演示dplyr中的n函数。我想知道dplyr::n是否能在多维体操中跟上table的步伐?@bondedust,您是指在3维或更多维阵列上操作时?我不希望dplyr能处理这个问题,但也许我误解了你的评论?这就是我的意思。但我不是一个精明的dplyr用户,也许group_by可以处理多个地层条件?老实说,我不知道地层条件是什么。。我的理解是dplyr只适用于data.frame类对象,这就是为什么我认为它不适用于多维数组,但这可能是错误的。dplyr的n显然不会取代table,但我相信它从未打算这样做。它接受任意长度的变量集来分组,这就是我的意思。谢谢。我试过那种形式,但需要时间来练习。我将在下次发布正确的数据格式。
setkey(setDT(df)[, indx := .N >= 4L, firm], indx)[J(TRUE)]
setDT(df)[df[, indx := .N >= 4L, firm]$indx]
setDT(df)[, if(.N >= 4L) .SD, by = firm]