对我的 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-month
和 ddply-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)。
希望这对您有所帮助。再次感谢您的帮助!
我正在尝试清理我的股票的 df,我需要摆脱每月观察少于 10 次的那些。
已经检查了这 2 个线程: subsetting-based-on-observations-in-a-month 和 ddply-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)。
希望这对您有所帮助。再次感谢您的帮助!