Включая пустышки в отношении дат

#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