如何在R中对共享类别的多个列进行one-hot编码?

cgvd09ve  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(153)

假设我有一个包含两列的dataframe:
| 标签1|标签2|
| - -----|- -----|
| 一个|B|
| 一个|C类|
| B| C类|
| C类|一个|
第一列中的A、B和C的值与第二列中的A、B和C的值相同。我希望编码看起来像这样:
| 标签1|标签2|是_A|是_B|是_C|
| - -----|- -----|- -----|- -----|- -----|
| 一个|B|一个|一个|0|
| 一个|C类|一个|0|一个|
| B| C类|0|一个|一个|
| C类|一个|一个|0|一个|
基本上,我只是想让它检查值是否出现在任一列中。如果是,则编码1,如果不是,则编码0。
现在,我知道我可以用if_else来写这个,像这样:

df <- df %>% mutate(is_A = if_else(label1 == 'A' | label2 == 'A'), 
is_B = if_else(label1 == 'B' | label2 == 'B'), 
is_C = if_else(label1 == 'C' | label2 == 'C'))

但是我有很多不同的类别,不想写出50多个if_else语句。我也试过这个:

encoded_labels <- model.matrix(~ label1 + label2 - 1, data = df)

但是这创建了用于label 1A与label 1B的单独编码。标签2A等。有没有更简单的方法?

5vf7fwbs

5vf7fwbs1#

在R中,你可以尝试:

cbind(df, unclass(table(row(df), unlist(df))))

  Label_1 Label_2 A B C
1       A       B 1 1 0
2       A       C 1 0 1
3       B       C 0 1 1
4       C       A 1 0 1

另一种方式:

cbind(df, +sapply(unique(unlist(df)), grepl, do.call(paste, df)))

  Label_1 Label_2 A B C
1       A       B 1 1 0
2       A       C 1 0 1
3       B       C 0 1 1
4       C       A 1 0 1

请注意,对于table,您应该执行以下操作:

+unclass(table(row(df), unlist(df))>0)

这将考虑具有多个值的行
如果你想使用model.matrix

+Reduce("|", split(data.frame(model.matrix(~values+0, stack(df))), col(df)))
  valuesA valuesB valuesC
1       1       1       0
2       1       0       1
3       0       1       1
4       1       0       1

相关问题