Выявление первых и последних наблюдений - PullRequest
0 голосов
/ 26 июня 2019

Я хотел бы определить количество фирм, которые начинаются и заканчиваются каждый месяц. Мои данные выглядят так, со множеством строк и столбцов.

   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 между ними. Например, ряд 2 фирма начинает 1990_01 и заканчивается 1990_05, несмотря на промежуточные значения NaN.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019
#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
0 голосов
/ 26 июня 2019

Предполагая, что ваш фрейм данных называется 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 значения для каждой фирмы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...