r标签变量组合

r label variable combination

我有一个包含三个变量的数据集。每个变量可以取两个值 "Yes" 或 "No"。所以 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的选项:

DT[order(C1, C2, C3), Idx := rleidv(.SD)]   

或者使用 Nadia 提到的查找连接,以便您可以控制索引:

x <- c("No", "Yes")
DT[CJ(C1=x, C2=x, C3=x)[, Idx := .I], on=.NATURAL, Idx := Idx]

输出:

     C1  C2  C3 Idx
 1: Yes  No  No   5
 2:  No Yes  No   3
 3:  No Yes  No   3
 4:  No Yes  No   3
 5: Yes Yes Yes   8
 6:  No  No Yes   2
 7:  No  No  No   1
 8: Yes Yes  No   7
 9: Yes Yes  No   7
10:  No Yes Yes   4
11: Yes  No Yes   6
12: Yes  No Yes   6
13: Yes Yes Yes   8

数据:

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")

正如@Nadia 在评论中指出的那样,有一种使用 2 的幂来获取顺序的自然方法。如果我们除了 "Yes" 和 "No" 之外还有其他选择(例如 "Maybe") 我们将使用 3 的幂(或 4、5 等)。在基础 R 中,我们有:

df$Index <- apply(df, 1, function(x) sum(2^(which(x == "Yes") - 1L)) + 1L)

这给出:

df
    C1  C2  C3 Index
1  Yes  No  No     2
2   No Yes  No     3
3   No Yes  No     3
4   No Yes  No     3
5  Yes Yes Yes     8
6   No  No Yes     5
7   No  No  No     1
8  Yes Yes  No     4
9  Yes Yes  No     4
10  No Yes Yes     7
11 Yes  No Yes     6
12 Yes  No Yes     6
13 Yes Yes Yes     8

我怀疑这是否比 data.table 版本快,但是答案的目的纯粹是为了教学。

这里输入供参考:

df <- read.table(text = "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",
                header = TRUE)