[英]Generate dummy variables from all possible combinations of variables
我有 5 個可以present
(=1) 或not
(=0) 的條件:
set.seed(101)
df <- data.frame(
alfa = sample(c(0, 1), 30, replace = TRUE),
beta = sample(c(0, 1), 30, replace = TRUE),
gamma = sample(c(0, 1), 30, replace = TRUE),
delta = sample(c(0, 1), 30, replace = TRUE),
epsilon = sample(c(0, 1), 30, replace = TRUE)
)
我想從這些條件存在的所有可能組合 (2 5 ) 中生成一組虛擬變量。 具體來說,我想驗證以下條件的伴隨存在:
alfa + beta
;alfa + gamma
;alfa + delta
;alfa + epsilon
;alfa + beta + gamma
;alfa + beta + gamma + delta + epsilon;
v <- as.matrix(expand.grid(rep(list(c(FALSE, TRUE)), ncol(df))))
head(v)
Var1 Var2 Var3 Var4 Var5
[1,] TRUE FALSE FALSE FALSE FALSE
[2,] FALSE TRUE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE
[4,] FALSE FALSE TRUE FALSE FALSE
[5,] TRUE FALSE TRUE FALSE FALSE
[6,] FALSE TRUE TRUE FALSE FALSE
indexes <- lapply(seq_len(nrow(v)), function(x) v[x, ])
names(indexes) <- apply(v, 1, function(x) paste(names(df)[x], collapse="."))
不幸的是我被困在這里。
我需要根據上述組合生成 27 個虛擬變量(32-5)。
# my df
set.seed(101)
df <- data.frame(
alfa = sample(c(0, 1), 30, replace = TRUE),
beta = sample(c(0, 1), 30, replace = TRUE),
gamma = sample(c(0, 1), 30, replace = TRUE),
delta = sample(c(0, 1), 30, replace = TRUE),
epsilon = sample(c(0, 1), 30, replace = TRUE)
)
# count the numebr of coesistent conditions:
df$n <- rowSums(df[1:5], na.rm = TRUE)
# Dirty way to compute multiple combinations:
df$alfa.beta <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 0 & df$delta == 0 & df$epsilon == 0 , 1, 0)
df$alfa.gamma <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 1 & df$delta == 0 & df$epsilon == 0 , 1, 0)
df$beta.gamma <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 1 & df$delta == 0 & df$epsilon == 0 , 1, 0)
df$alfa.beta.gamma <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 1 & df$delta == 0 & df$epsilon == 0 , 1, 0)
df$alfa.delta <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 0 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$beta.delta <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 0 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$alfa.beta.delta <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 0 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$gamma.delta <- ifelse (df$alfa == 0 & df$beta == 0 & df$gamma == 1 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$alfa.gamma.delta <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 1 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$beta.gamma.delta <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 1 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$alfa.beta.gamma.delta <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 1 & df$delta == 1 & df$epsilon == 0 , 1, 0)
df$alfa.epsilon <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 0 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$beta.epsilon <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 0 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$alfa.beta.epsilon <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 0 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$gamma.epsilon <- ifelse (df$alfa == 0 & df$beta == 0 & df$gamma == 1 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$alfa.gamma.epsilon <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 1 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$beta.gamma.epsilon <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 1 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$alfa.beta.gamma.epsilon <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 1 & df$delta == 0 & df$epsilon == 1 , 1, 0)
df$delta.epsilon <- ifelse (df$alfa == 0 & df$beta == 0 & df$gamma == 0 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$alfa.delta.epsilon <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 0 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$beta.delta.epsilon <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 0 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$alfa.beta.delta.epsilon <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 0 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$gamma.delta.epsilon <- ifelse (df$alfa == 0 & df$beta == 0 & df$gamma == 1 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$alfa.gamma.delta.epsilon <- ifelse (df$alfa == 1 & df$beta == 0 & df$gamma == 1 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$beta.gamma.delta.epsilon <- ifelse (df$alfa == 0 & df$beta == 1 & df$gamma == 1 & df$delta == 1 & df$epsilon == 1 , 1, 0)
df$alfa.beta.gamma.delta.epsilon <- ifelse (df$alfa == 1 & df$beta == 1 & df$gamma == 1 & df$delta == 1 & df$epsilon == 1 , 1, 0)
也許您可以通過在模型公式中使用stats::model.matrix
和^
運算符來返回所有(高階)變量交互來實現您的目標:
library(stats)
df <- data.frame(
alfa = sample(c(TRUE, FALSE), 30, replace = TRUE),
beta = sample(c(TRUE, FALSE), 30, replace = TRUE),
gamma = sample(c(TRUE, FALSE), 30, replace = TRUE),
delta = sample(c(TRUE, FALSE), 30, replace = TRUE),
epsilon = sample(c(TRUE, FALSE), 30, replace = TRUE)
)
df_dummy <- model.matrix(~ .^5, data = df)
colnames(df_dummy)
#> [1] "(Intercept)"
#> [2] "alfaTRUE"
#> [3] "betaTRUE"
#> [4] "gammaTRUE"
#> [5] "deltaTRUE"
#> [6] "epsilonTRUE"
#> [7] "alfaTRUE:betaTRUE"
#> [8] "alfaTRUE:gammaTRUE"
#> [9] "alfaTRUE:deltaTRUE"
#> [10] "alfaTRUE:epsilonTRUE"
#> [11] "betaTRUE:gammaTRUE"
#> [12] "betaTRUE:deltaTRUE"
#> [13] "betaTRUE:epsilonTRUE"
#> [14] "gammaTRUE:deltaTRUE"
#> [15] "gammaTRUE:epsilonTRUE"
#> [16] "deltaTRUE:epsilonTRUE"
#> [17] "alfaTRUE:betaTRUE:gammaTRUE"
#> [18] "alfaTRUE:betaTRUE:deltaTRUE"
#> [19] "alfaTRUE:betaTRUE:epsilonTRUE"
#> [20] "alfaTRUE:gammaTRUE:deltaTRUE"
#> [21] "alfaTRUE:gammaTRUE:epsilonTRUE"
#> [22] "alfaTRUE:deltaTRUE:epsilonTRUE"
#> [23] "betaTRUE:gammaTRUE:deltaTRUE"
#> [24] "betaTRUE:gammaTRUE:epsilonTRUE"
#> [25] "betaTRUE:deltaTRUE:epsilonTRUE"
#> [26] "gammaTRUE:deltaTRUE:epsilonTRUE"
#> [27] "alfaTRUE:betaTRUE:gammaTRUE:deltaTRUE"
#> [28] "alfaTRUE:betaTRUE:gammaTRUE:epsilonTRUE"
#> [29] "alfaTRUE:betaTRUE:deltaTRUE:epsilonTRUE"
#> [30] "alfaTRUE:gammaTRUE:deltaTRUE:epsilonTRUE"
#> [31] "betaTRUE:gammaTRUE:deltaTRUE:epsilonTRUE"
#> [32] "alfaTRUE:betaTRUE:gammaTRUE:deltaTRUE:epsilonTRUE"
由reprex 包(v0.3.0) 於 2019 年 6 月 16 日創建
擴展的 data.frame df_dummy
為所有 31 種可能的交互組合(除了攔截)返回單熱編碼列。 要失去截距,請將模型公式替換為~ .^5 + 0
或~.^5 - 1
。 請注意,通過將5
替換為df
的列數,這很容易擴展到更多變量。
編輯:上面的代碼不會給你一個變量組合的唯一存在(類似於你編輯的問題中的手動編碼)。 要實現這一點,您可以嘗試:
df_dummy <- model.matrix(~ .^5 - .^4 - 1, data = df)
colnames(df_dummy)
#> [1] "alfaFALSE:betaFALSE:gammaFALSE:deltaFALSE:epsilonFALSE"
#> [2] "alfaTRUE:betaFALSE:gammaFALSE:deltaFALSE:epsilonFALSE"
#> [3] "alfaFALSE:betaTRUE:gammaFALSE:deltaFALSE:epsilonFALSE"
#> [4] "alfaTRUE:betaTRUE:gammaFALSE:deltaFALSE:epsilonFALSE"
#> [5] "alfaFALSE:betaFALSE:gammaTRUE:deltaFALSE:epsilonFALSE"
#> [6] "alfaTRUE:betaFALSE:gammaTRUE:deltaFALSE:epsilonFALSE"
#> [7] "alfaFALSE:betaTRUE:gammaTRUE:deltaFALSE:epsilonFALSE"
#> [8] "alfaTRUE:betaTRUE:gammaTRUE:deltaFALSE:epsilonFALSE"
#> [9] "alfaFALSE:betaFALSE:gammaFALSE:deltaTRUE:epsilonFALSE"
#> [10] "alfaTRUE:betaFALSE:gammaFALSE:deltaTRUE:epsilonFALSE"
#> [11] "alfaFALSE:betaTRUE:gammaFALSE:deltaTRUE:epsilonFALSE"
#> [12] "alfaTRUE:betaTRUE:gammaFALSE:deltaTRUE:epsilonFALSE"
#> [13] "alfaFALSE:betaFALSE:gammaTRUE:deltaTRUE:epsilonFALSE"
#> [14] "alfaTRUE:betaFALSE:gammaTRUE:deltaTRUE:epsilonFALSE"
#> [15] "alfaFALSE:betaTRUE:gammaTRUE:deltaTRUE:epsilonFALSE"
#> [16] "alfaTRUE:betaTRUE:gammaTRUE:deltaTRUE:epsilonFALSE"
#> [17] "alfaFALSE:betaFALSE:gammaFALSE:deltaFALSE:epsilonTRUE"
#> [18] "alfaTRUE:betaFALSE:gammaFALSE:deltaFALSE:epsilonTRUE"
#> [19] "alfaFALSE:betaTRUE:gammaFALSE:deltaFALSE:epsilonTRUE"
#> [20] "alfaTRUE:betaTRUE:gammaFALSE:deltaFALSE:epsilonTRUE"
#> [21] "alfaFALSE:betaFALSE:gammaTRUE:deltaFALSE:epsilonTRUE"
#> [22] "alfaTRUE:betaFALSE:gammaTRUE:deltaFALSE:epsilonTRUE"
#> [23] "alfaFALSE:betaTRUE:gammaTRUE:deltaFALSE:epsilonTRUE"
#> [24] "alfaTRUE:betaTRUE:gammaTRUE:deltaFALSE:epsilonTRUE"
#> [25] "alfaFALSE:betaFALSE:gammaFALSE:deltaTRUE:epsilonTRUE"
#> [26] "alfaTRUE:betaFALSE:gammaFALSE:deltaTRUE:epsilonTRUE"
#> [27] "alfaFALSE:betaTRUE:gammaFALSE:deltaTRUE:epsilonTRUE"
#> [28] "alfaTRUE:betaTRUE:gammaFALSE:deltaTRUE:epsilonTRUE"
#> [29] "alfaFALSE:betaFALSE:gammaTRUE:deltaTRUE:epsilonTRUE"
#> [30] "alfaTRUE:betaFALSE:gammaTRUE:deltaTRUE:epsilonTRUE"
#> [31] "alfaFALSE:betaTRUE:gammaTRUE:deltaTRUE:epsilonTRUE"
#> [32] "alfaTRUE:betaTRUE:gammaTRUE:deltaTRUE:epsilonTRUE"
由reprex 包(v0.3.0) 於 2019 年 6 月 16 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.