从我的数据框中创建一个虚拟变量矩阵;使用 `NA` 作为缺失值

Create a matrix of dummy variables from my data frame; use `NA` for missing values

我有一个不同年份的数据,重复了好几次。我希望我的输出具有等于年数的列,每列一年。现在,目的是分别为每年创建虚拟对象。例如,只要主数据中存在与 2000 年平行的非 NA 观测值,2000 年的输出列就必须具有值“1”,否则为“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 loop" 来获得此输出。否则,我们将不胜感激任何更简单的方法。

不需要循环。我们可以使用 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