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)
我有一个包含三个变量的数据集。每个变量可以取两个值 "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)