R 根据各组的观测年数建立新的数据集
我想建立一个新的数据集,其中包括每个公司至少有4年的观测值,因为我将使用1~4个滞后回归。 在这种情况下,固定1和4用于新数据集,固定2和3应删除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
如何使用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]