簡體   English   中英

使用不同數量的觀察值在面板數據中為每年分配五分位數

[英]Assign Quintiles for each year in Panel data with different number of observations

我有包含3列的面板數據:公司,年份,收入。 每個公司的觀察次數不同。 例如,公司BBB有20個觀測值,而公司AAA只有19個觀測值。

Firm <- rep(c("AAA","BBB","CCC","DDD","EEE"), each=20)
Year <- rep(seq(1997,2016,1),times=5)
Income <- rnorm(100, mean=50, sd=10)
df <- cbind(Firm,Year,Income)
df <- as.data.frame(df) 
df <- df[!(df$Firm=="AAA" & df$Year=="2016"),]

實際數據包含5000多家公司,每家公司都有50多年的歷史。 每個公司的開始日期和結束日期都不同。 但這是一個很好的例子。

我想分別對所有公司的每個YEAR YEAR收入分配五分位數,然后將其放在新列“ Quint”中。 例如,對於1997年,“ AAA”公司的收入為50,“ BBB”公司的收入為49,“ CCC”公司的收入為48,“ DDD”公司的收入為47,“ EEE”公司的收入為46。對於1997年,“ AAA”具有1,“ BBB”具有2,“ CCC”具有3,“ DDD”具有4,而“ EEE”具有5。

我有一個自定義函數,多年來一直都在執行此功能,但每年都無法執行:

quan <- function (x){
y <-ifelse(x<=quantile(x,c(.2),na.rm=TRUE), 1,
ifelse(x>quantile(x,c(.2),na.rm=TRUE)&x<=quantile(x,c(.4),na.rm=TRUE), 2,
ifelse(x>quantile(x,c(.4),na.rm=TRUE)&x<=quantile(x,c(.6),na.rm=TRUE), 3,        
ifelse(x>quantile(x,c(.6),na.rm=TRUE)&x<=quantile(x,c(.8),na.rm=TRUE), 4,
ifelse(x>quantile(x,c(.8),na.rm=TRUE), 5, NA)))))
y
}

每年如何做? 謝謝。

使用dplyr軟件包,您可以使用ntile函數來計算五分位數。 Year分組,按Year獲得五分位數。 另外,請注意數據創建代碼中從cbinddata.frame的更改。 cbind創建一個矩陣,並且矩陣中的所有值都必須是同一類型,因此數字值被強制為字符串。

df <- data.frame(Firm, Year, Income)
df <- df[!(df$Firm=="AAA" & df$Year=="2016"),]

library(dplyr)

df = df %>% group_by(Year) %>% 
  mutate(Quint = ntile(Income, 5))
  Firm Year Income Quint <fctr> <dbl> <dbl> <int> 1 AAA 1997 66.99350 5 2 AAA 1998 55.18437 3 3 AAA 1999 31.39550 1 4 AAA 2000 57.39199 4 5 AAA 2001 41.03834 3 6 AAA 2002 51.85919 4 7 AAA 2003 38.21712 3 8 AAA 2004 45.97977 4 9 AAA 2005 47.62680 3 10 AAA 2006 48.78366 3 # ... with 89 more rows 

使用基數R,您可以使用lapplysplit分別對Year進行操作,並且cut函數可以按五分位數進行分組:

df = do.call(rbind, 
             lapply(split(df, df$Year), function(x) {
               data.frame(x, Quint=cut(x[ , "Income"], 
                                       quantile(x[,"Income"], probs=seq(0,1,0.2)), 
                                       labels=1:5,
                                       include.lowest=TRUE))
             }))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM