【问题标题】:Converting R Factors into Binary Matrix Values将 R 因子转换为二进制矩阵值
【发布时间】:2012-12-03 18:44:48
【问题描述】:

我想将我的数据框转换为一个矩阵,该矩阵将单个因子列扩展为多个,并根据因子分配一个 1/0。例如

C1 C2 C3
A  3  5
B  3  4
A  1  1

应该变成类似

C1_A C1_B C2 C3
1      0  3  5
0      1  3  4
1      0  1  1

如何在 R 中做到这一点?我试过data.matrix、as.matrix 没有返回我想要的。他们将“整数”值分配给单个因子列,没有扩展。

【问题讨论】:

    标签: r matrix statistics


    【解决方案1】:

    假设dat 是您的数据框:

    cbind(dat, model.matrix( ~ 0 + C1, dat))
    
      C1 C2 C3 C1A C1B
    1  A  3  5   1   0
    2  B  3  4   0   1
    3  A  1  1   1   0
    

    此解决方案适用于任意数量的因子水平,无需手动指定列名。

    如果你想排除列C1,你可以使用这个命令:

    cbind(dat[-1], model.matrix( ~ 0 + C1, dat))
    

    【讨论】:

    • OP 似乎想要model.matrix(~.+0,dat)。
    • @Roland 好主意 +1。这会更容易。
    • @Sven,这行得通,谢谢。它仍然在结果中保留 C1(除了 C1_A、C1_B 列),知道如何删除原始列吗?这是一个更普遍的问题(也许),只是一种简单的 R 方式说“给我除 that 之外的所有列”就可以了。
    • @user423805 查看我的答案的更新。或者看看 Roland 的评论。
    • 好的,我刚刚找到了这个:dat
    【解决方案2】:
    dat <- read.table(text =' C1 C2 C3
    A  3  5
    B  3  4
    A  1  1',header=T)
    

    使用变换

    transform(dat,C1_A =ifelse(C1=='A',1,0),C1_B =ifelse(C1=='B',1,0))[,-1]
      C2 C3 C1_A C1_B
    1  3  5    1    0
    2  3  4    0    1
    3  1  1    1    0
    

    或者为了获得更多的灵活性,使用within

    within(dat,{ 
                 C1_A =ifelse(C1=='A',1,0)
                 C1_B =ifelse(C1=='B',1,0)})
    
      C1 C2 C3  C1_B C1_A
    1  A  3  5    0    1
    2  B  3  4    1    0
    3  A  1  1    0    1
    

    【讨论】:

      【解决方案3】:

      让我们调用你的 data.frame df:

      library(reshape2)
      dcast(df,C2*C3~C1,fill=0,length)
      
        C2 C3 A B
      1  1  1 1 0
      2  3  4 0 1
      3  3  5 1 0
      

      【讨论】:

      • 感谢您的两个答案.. 有没有一种方法可以在不指定任何列名(例如 C1)的情况下进行此转换?只需 .. convert(df) 它将处理因素。 lm() 以及其他回归方法在内部执行此操作对吗?
      猜你喜欢
      • 2015-05-13
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2022-01-23
      • 2017-09-16
      • 2015-06-01
      相关资源
      最近更新 更多