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