r - 为具有不同观测数量的面板数据中的每年分配五分位数

标签 r data-manipulation data-cleaning

我的面板数据包含 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年。每个公司的开始日期和结束日期都不同。但这是一个足够好的例子。

我想分别为所有公司每年的收入分配五分位,并将其放入名为“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函数来计算五分位数。按年份分组可按年份获取五分位数。另请注意数据创建代码中从 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))
             }))

关于r - 为具有不同观测数量的面板数据中的每年分配五分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42096688/

相关文章:

R - 组合的冲积图

sql - 在 SQL 中将字符串转换为日期

python - Pandas:如何选择按键分组的一系列行的最小值

r - 将相似的列与不同的角色名称数据合并?

python - 用 Pandas 数据框中另一列中的值替换空列表

mysql - 计算最大值 (100%)

pandas - 在 Pandas 中查找不适合日期时间格式的行

r - ggplot 和 R : Issue with barplot and the width of the bars when certain x values are missing

r - 使用ggplot2绘制多边形shapefile和geom_points

R:计算自上次出现值以来的累计和和计数