Создание четвертичного столбца с использованием среднего значения по наблюдениям вместо значения строки

У меня есть временные ряды данных панели, и я хотел бы создать переменную с квартилем среднего значения данной переменной, чтобы фирма могла быть найдена только в данном квартиле. Например, если у меня есть 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 ответ

Решение

Вот один метод, использующий 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 вычисляет среднее значение по идентификатору и rank занимает эти средства. Мы передаем это ранжирование в столбец q data.frame, используя split, Как примечание стороны, потому что 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))
Другие вопросы по тегам