我有面板数据时间序列,我想创建一个具有给定变量均值四分位数的变量,这样一个公司只能在给定的四分位数中找到。例如,如果我有4家公司:
df =
id year value Quartile* Quartile**
1 2010 1 1 1
1 2015 1 1 1
2 2010 10 2 2
2 2015 10 2 2
3 2010 10 2 3
3 2015 20 3 3
4 2010 40 4 4
4 2015 40 4 4
使用标准方法Quartile *,例如:
df<- within(df, Quartile* <- as.integer(cut(TotalAssets_wins,
quantile(value, probs=0:4/4),
include.lowest=TRUE)))
我获得了Quartile *的值,但是,我想阻止公司随着时间的推移得到不同的四分位值。出于这个原因,我想计算四分位数的值,给出每个公司的所有观测值的平均值,以获得四分位数**的值。关键的区别在于它们是坚定的依赖值。关于如何在我的代码中实现它的任何想法?
答案 0 :(得分:1)
以下是使用tapply
,rank
和split
的一种方法。
# create 0 vector
dat$q <- 0
# fill it in
split(dat$q, dat$id) <- rank(tapply(dat$value, dat$id, FUN=mean))
此处,tapply
按ID计算均值,rank
对这些均值进行排名。我们使用split
将此排名提供到data.frame的第q列。作为旁注,因为tapply
和split
会以相同的顺序将观察结果排列到相同的组中,因此观察结果不必按任何特定顺序进行。
返回
dat
id year value Quartile. Quartile.. q
1 1 2010 1 1 1 1
2 1 2015 1 1 1 1
3 2 2010 10 2 2 2
4 2 2015 10 2 2 2
5 3 2010 10 2 3 3
6 3 2015 20 3 3 3
7 4 2010 40 4 4 4
8 4 2015 40 4 4 4
其中q列匹配Quartile ..列中的所需值。
数据强>
dat <-
structure(list(id = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), year = c(2010L,
2015L, 2010L, 2015L, 2010L, 2015L, 2010L, 2015L), value = c(1L,
1L, 10L, 10L, 10L, 20L, 40L, 40L), Quartile. = c(1L, 1L, 2L,
2L, 2L, 3L, 4L, 4L), Quartile.. = c(1L, 1L, 2L, 2L, 3L, 3L, 4L,
4L)), .Names = c("id", "year", "value", "Quartile.", "Quartile.."
), class = "data.frame", row.names = c(NA, -8L))