#r #dataframe
#r #фрейм данных
Вопрос:
Давайте рассмотрим следующие данные
df1<-data.frame('firm'=c(rep(1,3),rep(2,4)),'year'=c('1901','1902','1903','1900','1901','1902','1903'))
df1
firm year
1 1901
1 1902
1 1903
2 1900
2 1901
2 1902
2 1903
Я хочу включить манекены трех уровней в отношении года, т.Е. Первый манекен должен начинаться с самой ранней точки данных. Я имею в виду, что это должно выглядеть следующим образом :
firm year dummy_1 dummy_2 dummy_3
1 1901 0 1 0
1 1902 0 0 1
1 1903 1 0 0
2 1900 1 0 0
2 1901 0 1 0
2 1902 0 0 1
2 1903 1 0 0
Пожалуйста, обратите внимание, что первый фиктивный файл начинается с (0,1,0), потому что 1901 год является вторым после самой ранней точки даты. Также обратите внимание, что фирма two начинается с (1,0,0), потому что 1900 является самой ранней точкой данных.
Я начал с изменения вектора лет на вектор, в котором хранится информация о возникновении во времени. т.е.
as.numeric(as.factor((df1$year)))
2 3 4 1 2 3 4
И теперь я хотел изменить
2 to (0,1,0)
3 to (0,0,1)
4 to (1,0,0)
1 to (1,0,0)
Однако я не знаю, как это сделать на самом деле. Правильно ли я думаю о реализации этих манекенов?
Комментарии:
1. Наименьший год для фирмы 1 — 1901, а не 1900?
2. Да, это 1901 год, и это сложная часть проблемы — для некоторых фирм начальный год может отличаться
3. Так разве первая строка не должна быть (1,0,0)?
4. Нет, потому что (1,0,0) зарезервировано для самого раннего года в наборе данных, который равен 1900
Ответ №1:
Похоже, здесь вам нужна операция с модулем, начиная с минимального года и двигаясь дальше.
mtx <- matrix(0, nrow=nrow(df1), ncol=3)
mtx[cbind(seq_len(nrow(mtx)), 1 (as.integer(df1$year) - min(as.integer(df1$year))) %% 3)] <- 1
colnames(mtx) <- paste0("dummy_", 1:3)
df1 <- cbind(df1, mtx)
df1
# firm year dummy_1 dummy_2 dummy_3
# 1 1 1901 0 1 0
# 2 1 1902 0 0 1
# 3 1 1903 1 0 0
# 4 2 1900 1 0 0
# 5 2 1901 0 1 0
# 6 2 1902 0 0 1
# 7 2 1903 1 0 0
Это работает в предположении, что годы являются непрерывными; если есть разрыв, и вам нужно, чтобы год с разрывом не учитывался, тогда нам понадобится немного другой подход.
mtx <- matrix(0, nrow = nrow(df1), ncol = 3)
years <- unique(sort(df1$year))
years
# [1] "1900" "1901" "1902" "1903"
mtx[cbind(seq_len(nrow(mtx)), rep(1:3, length.out = length(years))[ match(df1$year, years) ])] <- 1
colnames(mtx) <- paste0("dummy_", 1:3)
df1 <- cbind(df1, mtx)
df1
# firm year dummy_1 dummy_2 dummy_3
# 1 1 1901 0 1 0
# 2 1 1902 0 0 1
# 3 1 1903 1 0 0
# 4 2 1900 1 0 0
# 5 2 1901 0 1 0
# 6 2 1902 0 0 1
# 7 2 1903 1 0 0