首页 > 解决方案 > 我可以按行识别第一个和最后一个观察值吗

问题描述

想确定每个月开始和结束的公司数量。目标是按列说明有多少公司开始和结束。

我的数据看起来像这样,有更多的行和列。

  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。

我尝试了以下代码

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))

但是得到以下错误信息

Error in arrange_impl(.data, dots) : 
  data frame column with incompatible number of rows (465), expecting : 59378

任何帮助表示赞赏。

标签: r

解决方案


你可以做

apply(df[,-1], 1, function(x) range(which(!is.nan(x))))
#      [,1] [,2] [,3]
# [1,]    3    1    1
# [2,]    5    5    4

如果您想为行和列添加名称,那么我们可以将其扩展为:

apply(df[,-1], 1, function(x) range(which(!is.nan(x)))) %>%
  t %>%
  `colnames<-`(c('First','Last')) %>%
  `row.names<-`(df[,1])
#      First Last
# fg23     3    5
# sdf1     1    5
# sdf1     1    4

推荐阅读