【发布时间】:2017-06-25 02:25:17
【问题描述】:
我的面板数据包含 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 年。每个公司的开始日期和结束日期都是不同的。但这是一个足够好的例子。
我想将 quintile 分配给所有公司每年的收入,并将其放在一个名为“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
}
每年如何做?谢谢。
【问题讨论】:
-
使用
df <- data.frame(Firm,Year,Income)代替df <- cbind(Firm,Year,Income)。然后你就不需要下一行,并且避免将所有变量都变成因子变量。
标签: r data-manipulation data-cleaning