我有一个包含三个变量的数据集。每个变量可以采用两个值“是”或“否”。因此2^3=8
这三个变量的不同组合。
C1 C2 C3
Yes No No
No Yes No
No Yes No
No Yes No
Yes Yes Yes
No No Yes
No No No
Yes Yes No
Yes Yes No
No Yes Yes
Yes No Yes
Yes No Yes
Yes Yes Yes
如何创建第四列来指示列C1,C2,C3的组合?预期的输出将是
C1 C2 C3 I
Yes No No 1
No Yes No 2
No Yes No 2
No Yes No 2
Yes Yes Yes 8
No No Yes 3
No No No 4
Yes Yes No 5
Yes Yes No 5
No Yes Yes 6
Yes No Yes 7
Yes No Yes 7
Yes Yes Yes 8
使用data.table
的选项,其中DF
是您的数据帧:
data.table::rleidv(DF)
data.table
中的用法示例:
DT[, Idx := rleidv(.SD)]
输出:
C1 C2 C3 Idx
1: Yes No No 1
2: No Yes No 2
3: No Yes No 2
4: No Yes No 2
5: Yes Yes Yes 3
6: No No Yes 4
7: No No No 5
8: Yes Yes No 6
9: Yes Yes No 6
10: No Yes Yes 7
11: Yes No Yes 8
12: Yes No Yes 8
13: Yes Yes Yes 9
并且如果组合可能混杂在一起,则可以确保在创建索引之前先进行排序:
DT[order(C1, C2, C3), Idx := rleidv(.SD)]
如果我们可以四处移动行,则可以在创建索引之前按列排序。
数据:
library(data.table)
DT <- fread("C1 C2 C3
Yes No No
No Yes No
No Yes No
No Yes No
Yes Yes Yes
No No Yes
No No No
Yes Yes No
Yes Yes No
No Yes Yes
Yes No Yes
Yes No Yes
Yes Yes Yes")