簡體   English   中英

如何將幾個二元變量組合成一個新的分類變量

[英]How to combine several binary variables into a new categorical variable

我正在嘗試將幾個二進制變量組合成一個分類變量。 我有十個分類變量,每個變量都描述了一項工作的任務。

數據看起來像這樣:

Personal_Help <- c(1,1,2,1,2,1)
PR <- c(2,1,1,2,1,2)
Fundraising <- c(1,2,1,2,2,1)
# etc.

我的目標是將它們組合成一個變量,其中每個二進制變量的值 1(=是)將是分類變量的單獨級別。

為了說明我的想象(顯然錯誤的代碼):

If Personal_Help = 1 -> Jobcontent = 1
If PR = 1 -> Jobcontent = 2
If Fundraising = 1 -> Jobcontent = 3

等等

非常感謝您!

正如@ulfelder 評論的那樣,您需要闡明如何處理多列為1的情況。

假設您想使用等於1第一列,您可以使用which.min() ,按行應用:

data <- data.frame(Personal_Help, PR, Fundraising)

data$Jobcontent <- apply(data, MARGIN = 1, which.min)

結果:

  Personal_Help PR Fundraising Jobcontent
1             1  2           1          1
2             1  1           2          1
3             2  1           1          2
4             1  2           2          1
5             2  1           2          2
6             1  2           1          1

如果您希望Jobcontent包含每個作業的名稱,您可以索引names(data)

data$Jobcontent <- names(data)[apply(data, MARGIN = 1, which.min)]

結果:

  Personal_Help PR Fundraising    Jobcontent
1             1  2           1 Personal_Help
2             1  1           2 Personal_Help
3             2  1           1            PR
4             1  2           2 Personal_Help
5             2  1           2            PR
6             1  2           1 Personal_Help

由於存在三個不同的變量,並且每個變量可以取 2 個值中的任何一個,因此這三個變量有 2^3 = 8 種可能的唯一組合,每個變量都應該有一個唯一的關聯編號。

一種方法是把每一列想象成一個三位二進制數中的一個數字。 如果我們從每一列中減去 1,我們會得到 1 表示“否”,而 0 表示“是”。 這意味着我們的八個可能的唯一值以及與每個值相關聯的二進制數將是:

binary    decimal
0 0 0   = 0
0 0 1   = 1
0 1 0   = 2
0 1 1   = 3
1 0 0   = 4
1 0 1   = 5
1 1 0   = 6
1 1 1   = 7

該系統適用於任意數量的列,可按如下方式實現:

Personal_Help <- c(1,1,2,1,2,1)
PR <- c(2,1,1,2,1,2)
Fundraising <- c(1,2,1,2,2,1)
df <- data.frame(Personal_Help, PR, Fundraising)

New_var <- 0

for(i in seq_along(df)) New_var <- New_var + (2^(i - 1)) * (df[[i]] - 1)

df$New_var <- New_var

最終結果將是:

df
#>   Personal_Help PR Fundraising New_var
#> 1             1  2           1       2
#> 2             1  1           2       4
#> 3             2  1           1       1
#> 4             1  2           2       6
#> 5             2  1           2       5
#> 6             1  2           1       2

在您的實際數據中,將有 1024 種可能的任務組合,因此這將為New_var生成 0 到 1023 之間的數字。由於它是如何生成的,您實際上可以使用這個數字對整行進行逆向工程,只要您知道原始列順序。

如果您只對變量中第一次出現的1感興趣:

df <- data.frame(t(data.frame(Personal_Help, PR,Fundraising)))
result <- sapply(df, function(x) which(x==1)[1])

X1 X2 X3 X4 X5 X6 
 1  1  2  1  2  1 

當然,這將取決於您在評論中詢問的多個值為 1 時要執行的操作。

max.col可能在這里有所幫助:

Jobcontent <- max.col(-data.frame(Personal_Help, PR, Fundraising), "first")
Jobcontent
#> [1] 1 1 2 1 2 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM