对我的 df 进行子集化,前提是每个 ID 每月有 >10 个 obs

subset my df provided that each ID has >10 obs a month

我正在尝试清理我的股票的 df,我需要摆脱每月观察少于 10 次的那些。

已经检查了这 2 个线程: subsetting-based-on-observations-in-a-monthddply-for-sum-by-group-in-r

但是我是菜鸟,我还搞不懂。

简而言之: 请帮我排除每月观察值 <10(如果可能的话,任何月份)的 ID(股票)。它们通过来自 CRSP (permno) 的永久号码进行识别。

这是 df:Lessthan10days.csv

非常感谢,

狮子座

我们可以在将 'date' 列转换为 'Date' class 后从 'MonthYr' 创建一个列。获取每组 ('permno'、'MonthYr') 的观察值 ('n') 的数量,并使用它来删除至少有一个 'n' 的 ID ('permno') ] 小于 10.

library(dplyr)
res <- df1 %>%
        mutate(MonthYr=format(as.Date(date, format='%m/%d/%Y'), '%Y-%m')) %>%
        group_by(permno, MonthYr) %>%
        mutate(n=n()) %>% 
        group_by(permno) %>% 
        filter(all(n>=10))

 all(res$n>=10)
 #[1] TRUE
 tbl <-table(res$permno, res$MonthYr)
 all(tbl[tbl!=0]>=10)
 #[1] TRUE

或使用与data.table

类似的方法
 library(data.table)
  setDT(df1)[,N:=.N , list(permno, MonthYr=format(as.Date(date, 
             format='%m/%d/%Y'), '%Y-%m'))][all(N>=10) , permno][]

数据

df1 <- read.csv('Lessthan10days.csv', header=TRUE, stringsAsFactors=FALSE)

我只想补充一点,下一个命令部分起作用:

library(dplyr)
res <- df1 %>%
        mutate(MonthYr=format(as.Date(date, format='%m/%d/%Y'), '%Y-%m')) %>%
        group_by(permno, MonthYr) %>%
        mutate(n=n()) %>% 
        group_by(permno) %>% 
        filter(all(n>=10))

 all(res$n>=10)
 #[1] TRUE
 tbl <-table(res$permno, res$MonthYr)
 all(tbl[tbl!=0]>=10)
 #[1] TRUE

他们没有完全清理样本,我相信一些 NA 值被算作观察值,所以他们可能 'escape' subsetting/cleaning。

因此我手动进行了确认。我可以提出的一个建议是只使用:

>tbl <-table(res$permno, res$MonthYr)
>write.csv(tbl,"tbl.csv")

然后您自己查看电子表格以清理 obs<10(对于每个 year/stock)。 最重要的是,您可以过滤价格的 NA 值,并删除出现几个月且观察值 <10 的 5-10 只股票 (ids)。

希望这对您有所帮助。再次感谢您的帮助!