【问题标题】:Make subset which is chopped off first 4 observations by each group制作被每组前 4 个观察值截断的子集
【发布时间】:2015-01-30 23:29:48
【问题描述】:
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)。

对于时间序列数据,我们可以使用“窗口”命令来获取特定年份的观察结果。但是,对于面板数据集,如何处理时间(年、月、季度),尤其是不平衡的面板数据集?

【问题讨论】:

  • 这个问题与您之前的问题 (stackoverflow.com/questions/27236828/…) 类似,您在其中得到了几个答案,但从未接受任何一个。单击您认为最有帮助或在代码中使用的答案旁边的绿色复选标记。
  • @beginneR 我之前没有使用过这个网站,所以我不知道我应该接受这个答案。绿色复选标记在哪里? >%> 是什么?谢谢。
  • 没问题,这就是我告诉你这个的原因。 %>% 运算符用于将多个操作链接在一起。这里在dplyr代码中使用,安装加载包后即可使用。
  • @beginneR 我是否选择了上一个答案?-- 表示我没有找到绿色复选框,我点击了“投票”框。
  • 什么意思? (如果您想知道您是否接受了上一个问题的答案:据我所知,还没有。一旦您检查了答案,您会在它旁边看到绿色的复选标记)。复选框位于赞成/反对票按钮下方。一旦你点击它就会变成绿色。

标签: r


【解决方案1】:

假设您想在对数据集进行子集化后 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)

【讨论】:

  • 另一个 dplyr 选项是 df %&gt;% group_by(firm) %&gt;% filter(n()&gt;=4 &amp; 1:n() &gt; 4)(或使用 row_number() 而不是 1:n())。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多