【问题标题】:How to combine several binary variables into a new categorical variable如何将几个二元变量组合成一个新的分类变量
【发布时间】:2022-08-13 20:45:51
【问题描述】:

我正在尝试将几个二进制变量组合成一个分类变量。我有十个分类变量,每个变量都描述了一项工作的任务。

数据看起来像这样:

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

等等

非常感谢您!

  • 您能否更具体地说明您希望如何处理多个输入 == 1 的情况?例如,如果Personal_Help == 1Fundraising == 1,应该分配什么值?

标签: r


【解决方案1】:

如果您只对变量中第一次出现 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 

当然,这将取决于您在 cmets 中要求的多个值为 1 时要执行的操作。

【讨论】:

    【解决方案2】:

    由于存在三个不同的变量,并且每个变量可以取 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 之间的数字。由于它的生成方式,您实际上可以使用这个单个数字对整行进行逆向工程如您所知,原始列顺序。

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多