r标签变量组合
我有一个包含三个变量的数据集。每个变量可以取两个值“是”或“否”。因此r标签变量组合,r,classification,combinations,R,Classification,Combinations,我有一个包含三个变量的数据集。每个变量可以取两个值“是”或“否”。因此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
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
使用
数据的选项。表
:
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]
数据:
库(data.table)
DT正如@Nadia在评论中指出的,有一种自然的方法可以使用2的幂来获得顺序。如果我们除了“是”和“否”(例如“可能”)之外还有其他选择,我们将使用3的幂(或4、5等)。在baseR
中,我们有:
df$Index <- apply(df, 1, function(x) sum(2^(which(x == "Yes") - 1L)) + 1L)
我怀疑这比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)
df是否存在标签的重要性顺序如果可以是任何顺序,则使用(df1,as.integer(交互作用(C1,C2,C3,lex.order=TRUE))
或库(dplyr);df1%>%变异(I=组指数(,C1,C2,C3))
或v1您显然为每个组合分配了一个值,我认为您应该提供一个参考列表,说明如何将每个组合映射到该值。如果你在映射方面很灵活,我可能会建议一个优雅的解决方案可能在于将你的是/否转换为1/0,然后每列C1为2^0,C2为2^1,C3为2^2,然后将其相加,这是一个简单的数学解。@Nadia,如果我将值转换为1和0并进行行求和,那么对于X1=1,X2=0,X3=1,我将得到2。X1=1,X2=1,X3=0。这两个是不一样的。@JosephWood感谢您给我发帖的机会,不幸的是,我实际上已经被atm机挤满了,所以请继续,因为您已经找到了解决方案!如果没有先排序,这不会重新开始编号吗?@thelatemail,谢谢。如果需要,我们可以在i
中添加order
。@chinsoon12,第5行和第13行有何不同,它们都有相同的值?“我原以为他们是一样的。”里洛廷加发得太快了。在处理了最近邮件的评论后更新了输出,这是有意义的。谢谢,我会试试的。
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
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)