r - 如何基于 R 中的两列创建虚拟对象

标签 r dummy-variable

假设我有一个数据框:
性别可以取F为女或M为男
种族可以将 A 作为亚洲人,W 作为白人,B 作为黑人,H 作为西类牙裔

| id | Gender | Race |
| --- | ----- | ---- |
| 1   | F    | W |
| 2   | F    | B |
| 3   | M    | A |
| 4   | F    | B |
| 5   | M    | W |
| 6   | M    | B |
| 7   | F    | H |
我想有一组基于性别和种族的列作为虚拟对象,数据框应该像
| id | Gender | Race | F_W | F_B | F_A | F_H | M_W | M_B | M_A | M_H |
| --- | ----- | ---- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1   | F    | W   |  1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
| 2   | F    | B   |  0  |  1  |  0  |  0  |  0  |  0  |  0  |  0  |
| 3   | M    | A   |  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |
| 4   | F    | B   |  0  |  1  |  0  |  0  |  0  |  0  |  0  |  0  |
| 5   | M    | W   |  0  |  0  |  0  |  0  |  1  |  0  |  0  |  0  |
| 6   | M    | B   |  0  |  0  |  0  |  0  |  0  |  1  |  0  |  0  |
| 7   | F    | H   |  0  |  0  |  0  |  1  |  0  |  0  |  0  |  0  |
我的实际数据包含的类别比这个例子多得多,所以如果你能以更简洁的方式制作它,我会很感激。
语言是R。
感谢您的帮助。

最佳答案

除了列名之外,您还可以通过 model.matrix 获得此信息。函数和仅表达交互项的公式,并减去截距:

> dm = cbind(d,model.matrix(~Gender:Race-1, data=d))
> dm
   id Gender Race GenderF:RaceA GenderM:RaceA GenderF:RaceB GenderM:RaceB
1   1      F    H             0             0             0             0
2   2      M    H             0             0             0             0
3   3      M    W             0             0             0             0
4   4      F    H             0             0             0             0
5   5      M    H             0             0             0             0
[etc]
如果您关心确切的名称,则可以通过一些字符串处理轻松地将它们分类。
> names(dm)[-(1:3)] = sub("Gender","",sub("Race","",sub(":","_",names(dm)[-(1:3)])))
> dm
   id Gender Race F_A M_A F_B M_B F_H M_H F_W M_W
1   1      F    H   0   0   0   0   1   0   0   0
2   2      M    H   0   0   0   0   0   1   0   0
3   3      M    W   0   0   0   0   0   0   0   1
4   4      F    H   0   0   0   0   1   0   0   0
5   5      M    H   0   0   0   0   0   1   0   0
6   6      F    H   0   0   0   0   1   0   0   0
7   7      F    H   0   0   0   0   1   0   0   0
8   8      M    A   0   1   0   0   0   0   0   0
9   9      M    W   0   0   0   0   0   0   0   1
10 10      F    B   0   0   1   0   0   0   0   0
如果您关心列顺序....

关于r - 如何基于 R 中的两列创建虚拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68420982/

相关文章:

r - R 中无向图中的循环

r - macOS Big Sur 下的 Shell PATH to R

r - 在非常强大的数据集中只保留特定列的列表?

Python OneHotEncoder 使用许多虚拟变量或更好的实践?

从 R 中的虚拟对象重建分类变量

使用多个解释变量将数据从长到宽 reshape

r - 如何调整 interaction.plot 和 lineplot.CI 的图例位置?

r - 分隔行以制作虚拟行

从数据中删除所有二进制变量