2016-03-16 6 views
0

У меня есть набор данных панели, как показано ниже. Но фактический набор данных имеет несколько тысяч наблюдений. Я хочу создать 14 фасадов в качестве новой колонки Year_dum за 1984-1998 годы (15 лет). Я искал создание фиктивных переменных в r, но не смог найти способ сделать это с помощью целых чисел года. Может ли кто-нибудь помочь мне сделать это в r.Создание переменных факторов для целых чисел года в r

 

+--------+------+------+------+----------+ 
| Time | year | Firm | Prod | Year_dum | 
+--------+------+------+------+----------+ 
| Jan-84 | 1984 | A | 28.2 |  0 | 
| Feb-84 | 1984 | A | 26.6 |  0 | 
| Mar-84 | 1984 | A | 30.3 |  0 | 
| Apr-85 | 1985 | A | 33.2 |  1 | 
| May-85 | 1985 | A | 30.1 |  1 | 
| Jun-85 | 1985 | A | 28.3 |  1 | 
| Jan-84 | 1984 | B | 28.6 |  0 | 
| Feb-84 | 1984 | B | 28.9 |  0 | 
| Mar-84 | 1984 | B | 28.1 |  0 | 
| Oct-84 | 1984 | C | 28.8 |  0 | 
| Nov-85 | 1985 | C | 31.6 |  1 | 
| Dec-86 | 1986 | C | 26.9 |  2 | 
| Jan-89 | 1989 | C | 28.6 |  5 | 
| Feb-98 | 1998 | C | 29.6 |  14 | 
+--------+------+------+------+----------+ 

Этот простой набор данных можно получить, используя следующую информацию.

structure(list(Time = structure(c(6L, 4L, 9L, 2L, 10L, 8L, 6L, 
4L, 9L, 12L, 11L, 3L, 7L, 5L, 1L, 1L, 1L), .Label = c("", "Apr-85", 
"Dec-86", "Feb-84", "Feb-98", "Jan-84", "Jan-89", "Jun-85", "Mar-84", 
"May-85", "Nov-85", "Oct-84"), class = "factor"), year = c(1984L, 
1984L, 1984L, 1985L, 1985L, 1985L, 1984L, 1984L, 1984L, 1984L, 
1985L, 1986L, 1989L, 1998L, NA, NA, NA), Firm = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L 
), .Label = c("", "A", "B", "C"), class = "factor"), Prod = c(28.2, 
26.6, 30.3, 33.2, 30.1, 28.3, 28.6, 28.9, 28.1, 28.8, 31.6, 26.9, 
28.6, 29.6, NA, NA, NA), Year_dum = c(0L, 0L, 0L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 1L, 2L, 5L, 14L, NA, NA, NA)), .Names = c("Time", 
"year", "Firm", "Prod", "Year_dum"), class = "data.frame", row.names = c(NA, 
-17L)) 
+1

Что вы ожидаемый результат? – akrun

+0

Я отредактировал таблицу так, чтобы теперь она показывала, как мне нужны манекены года в моем фрейме данных. – Doo

+0

Опубликовано решение ниже – akrun

ответ

0

Мы можем попробовать

df$Year_dum <- df$year-min(df$year) 
df$Year_dum 
#[1] 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 

Или используйте match

with(df, match(year, unique(year))-1) 
#[1] 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 
+0

Извините, и первый из них не работает и дает мне следующую ошибку. Ошибка в '$ <-. Data.frame' (x, name, value): Замена имеет 15 строк, данные имеют 6954, а второй ответ не матч с годами. Это скорее дает от 0 до 15 каждый, повторяя 12 раз, независимо от соответствующего года. Это неуравновешенная панель, которая имеет 12 * 15 ежемесячных точек данных для некоторых людей, а для некоторых меньше – Doo

+0

@Doo. Решения были основаны на выводе, который вы показали. – akrun

2

Например, вы можете использовать dummies пакет (установить его первым использованием install.packages("dummies")). Пример:

library(dummies) 

df <- data.frame("val" = 1:5, "year" = c(1984, 1984, 1985, 1985, 1986)) 
# after creating the dummies, column-bind it to the original dataframe 
df <- cbind(df, dummy("year", df, sep = "_")) 
> df 

    val year year_1984 year_1985 year_1986 
1 1 1984   1   0   0 
2 2 1984   1   0   0 
3 3 1985   0   1   0 
4 4 1985   0   1   0 
5 5 1986   0   0   1 
+0

Фактически, мой набор данных - это панель, и я не могу использовать этот метод, потому что эти 15 лет повторяются для большинства людей. – Doo

+0

Эти годы повторяются и в моем примере. – paljenczy

0

Вот пример использования base только:

for(i in 1:nrow(x)) assign(paste("year", x$year[i], sep="_"), x$year == x$year[i]) 
Смежные вопросы