确定第一个和最后一个观察对象

时间:2019-06-25 22:25:26

标签: r

我想确定每月开始和结束的公司数量。我的数据看起来像这样,有更多的行和列。

   Firm   Return_1990_01  Return_1990_02 Return_1990_03 Return_1990_04 Return_1990_05 
#1 fg23         NaN             NaN             1.54          2.34        .641      
#2 sdf1         1.35            NaN             3.53          NaN         .231     
#3 sdf1         1.12            2.44            1.51          1.64         NaN     

一个挑战是,一家公司之间可能存在NaN。例如,尽管行之间存在NaN,但该行的第2行从1990_01开始到1990_05结束。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

假设您的数据帧名为df,则可以尝试以下操作:

library(dplyr)
library(tidyr)

df %>% 
  gather(month, value, -Firm) %>% 
  filter(!is.nan(value)) %>% 
  arrange(Firm, month) %>% 
  group_by(Firm) %>% 
  summarise(start = first(month), end = last(month))

gather将数据框从宽格式转换为长格式。接下来,根据需要过滤任何NaN。然后搜索每个公司的第一个和最后一个非NaN值。

答案 1 :(得分:0)

#Find first and last occurrence of !NA per Firm
tt <- apply(!is.na(x[-1]), 1, function(x) range(which(x)))

#Sum up the first/last occurrence in the month
res <- sapply(2:ncol(x)-1, function(i) {c(nStart=sum(tt[1,]==i), nEnd=sum(tt[2,]==i) )})
colnames(res) <- colnames(x)[-1] #Add the Month name
res
#       Return_1990_01 Return_1990_02 Return_1990_03 Return_1990_04 Return_1990_05
#nStart              2              0              1              0              0
#nEnd                0              0              0              1              2