使用每个观察值的平均值而不是行值创建四分位列

时间:2017-08-31 16:15:24

标签: r dataframe grouping quartile

我有面板数据时间序列,我想创建一个具有给定变量均值四分位数的变量,这样一个公司只能在给定的四分位数中找到。例如,如果我有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 *的值,但是,我想阻止公司随着时间的推移得到不同的四分位值。出于这个原因,我想计算四分位数的值,给出每个公司的所有观测值的平均值,以获得四分位数**的值。关键的区别在于它们是坚定的依赖值。关于如何在我的代码中实现它的任何想法?

1 个答案:

答案 0 :(得分:1)

以下是使用tapplyranksplit的一种方法。

# 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列。作为旁注,因为tapplysplit会以相同的顺序将观察结果排列到相同的组中,因此观察结果不必按任何特定顺序进行。

返回

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))