从我的数据框中创建一个虚拟变量矩阵;使用“NA”表示缺失值

时间:2016-10-01 01:19:41

标签: r matrix dummy-variable

我有一个基于不同年份的数据,重复了几次。我希望我的输出的列数等于年数,每列的列数为一年。现在,目的是分别为每年创建一个假人。例如,2000年的输出列必须具有值" 1"只要在与2000年平行的主数据中存在非NA观测值,否则" 0"。此外,NA必须保持NA。请参阅下面的一小部分输入数据:

df:
2000    NA
2001    NA
2002   -1.3
2000    1.1
2001    0
2002    NA
2000   -3
2001    3
2002    4.1

现在输出应为:

df1:
2000    2001    2002
 NA      NA      NA
 NA      NA      NA
 0       0       1
 1       0       0
 0       1       0
 NA      NA      NA
 1       0       0
 0       1       0
 0       0       1

如果可能,我希望使用" for循环"来获得此输出。否则,任何更简单的方法将不胜感激。

1 个答案:

答案 0 :(得分:3)

不需要循环。我们可以使用model.matrix

## your data variable and NA index
x <- c(NA, NA, -1.3, 1.1, 0, NA, -3, 3, 4.1)
na_id <- is.na(x)

## code your year variable as a factor
year <- factor(rep(2000:2002, 3))

## original model matrix; drop intercept to disable contrast
X <- model.matrix(~ year - 1)

#  year2000 year2001 year2002
#1        1        0        0
#2        0        1        0
#3        0        0        1
#4        1        0        0
#5        0        1        0
#6        0        0        1
#7        1        0        0
#8        0        1        0
#9        0        0        1

## put NA where `x` is NA (we have used recycling rule here)
X[na_id] <- NA

#  year2000 year2001 year2002
#1       NA       NA       NA
#2       NA       NA       NA
#3        0        0        1
#4        1        0        0
#5        0        1        0
#6       NA       NA       NA
#7        1        0        0
#8        0        1        0
#9        0        0        1

矩阵X将具有一些属性。如果您愿意,可以删除它们:

attr(X, "assign") <- attr(X, "contrasts") <- NULL

您还可以将此矩阵的列名重命名为其他内容,例如

colnames(X) <- 2000:2002