从我的数据框中创建一个虚拟变量矩阵;使用 `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
我有一个不同年份的数据,重复了好几次。我希望我的输出具有等于年数的列,每列一年。现在,目的是分别为每年创建虚拟对象。例如,只要主数据中存在与 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