Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r标签变量组合_R_Classification_Combinations - Fatal编程技术网

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等)。在base
R
中,我们有:

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)