在具有不同观察次数的面板数据中为每年分配五分位数
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 年。每个公司的开始日期和结束日期都不同。但这是一个足够好的例子。
我想分别为所有公司每年的收入分配五分位数,并将其放在名为 "Quint" 的新列中。例如,对于 1997 年,公司 "AAA" 的收入为 50,公司 "BBB" 的收入为 49,公司 "CCC" 的收入为 48,公司 "DDD" 的收入为 47,公司 "EEE" 有收入 46。所以公司 "AAA" 有 1,"BBB" 有 2,"CCC" 有 3,"DDD" 有 4,"EEE" 有 5 , 1997.
我有一个自定义函数,它多年来一直执行此操作,但无法每年执行:
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
分组以按年份获得五分位数。另外,请注意 data-creation 代码中从 cbind
到 data.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
使用 base R,您可以使用 lapply
和 split
分别对每个 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))
}))
我有包含 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。所以公司 "AAA" 有 1,"BBB" 有 2,"CCC" 有 3,"DDD" 有 4,"EEE" 有 5 , 1997.
我有一个自定义函数,它多年来一直执行此操作,但无法每年执行:
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
分组以按年份获得五分位数。另外,请注意 data-creation 代码中从 cbind
到 data.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
使用 base R,您可以使用 lapply
和 split
分别对每个 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))
}))