2016-03-16 92 views
0

我有一個面板數據集,如下所示。但實際的數據集有幾千個觀測值。我想在1984 - 1998年(15年)內創建14個工廠作爲新的「Year_dum」欄。我搜索了在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 | 
+--------+------+------+------+----------+ 

這個簡單的數據集可以使用下面的dput訪問。

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])