【问题标题】:r label variable combinationr 标签变量组合
【发布时间】:2020-08-26 10:33:55
【问题描述】:

我有一个包含三个变量的数据集。每个变量可以取两个值“是”或“否”。所以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

【问题讨论】:

  • 标签是否有重要顺序
  • 如果可以是任意顺序,则with(df1, as.integer(interaction(C1, C2, C3, lex.order = TRUE)))library(dplyr);df1 %>% mutate(I = group_indices(., C1, C2, C3))v1 <- do.call(paste, df1); match(v1, unique(v1))
  • 您显然已经为每个组合分配了一个值,我认为您应该提供一个参考列表,您如何将每个组合映射到该值。如果您在映射方面很灵活,我可能会建议一个优雅的解决方案可能在于将您的 Yes / No 转换为 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 感谢有机会发帖,不幸的是,我实际上很忙,所以请继续,因为您已经制定了解决方案!

标签: r classification combinations


【解决方案1】:

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

【讨论】:

  • 不先排序不会重新编号吗?
  • @thelatemail,谢谢。如果需要,我们可以在i 中添加order
  • @chinsoon12,第 5 行和第 13 行有何不同,它们的值相同?我期待它们是一样的。
  • @RiloDinga 发布得太快了。在解决 thelatemail 的评论后更新了输出
【解决方案2】:

正如@Nadia 在 cmets 中指出的那样,有一种使用 2 的幂来获得订单的自然方法。如果除了“是”和“否”之外我们还有其他选项(例如“也许”),我们将使用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)

【讨论】:

  • 这是有道理的。谢谢,我会试试的。
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 2011-01-10
  • 1970-01-01
  • 2015-03-13
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多