【问题标题】:group cases by shared values in r [duplicate]按r中的共享值对案例进行分组[重复]
【发布时间】:2017-10-03 00:14:02
【问题描述】:

我有一个这样的数据集:

    case x y 
      1  4 5  
      2  4 5  
      3  8 9 
      4  7 9
      5  6 3
      6  6 3

我想创建一个分组变量。 当 x 和 y 相同时,此变量应具有相同的值。 我不在乎这个值是什么,而是将它们分组。因为在我的数据集中,如果两个案例的 x 和 y 相同,它们可能属于同一个组织。我想看看有哪些组织。

所以我的首选数据集如下所示:

    case x y org
      1  4 5  1
      2  4 5  1
      3  8 9  2
      4  7 9  3
      5  6 3  4 
      6  6 3  4

我必须如何在 R 中对此进行编程?

【问题讨论】:

    标签: r


    【解决方案1】:

    正如你所说,我不在乎这个值是什么,你可以跟着做

    dt$new=as.numeric(as.factor(paste(dt$x,dt$y)))
    dt
      case x y new
    1    1 4 5   1
    2    2 4 5   1
    3    3 8 9   4
    4    4 7 9   3
    5    5 6 3   2
    6    6 6 3   2
    

    【讨论】:

      【解决方案2】:

      来自dplyr 的解决方案,使用group_indices

      library(dplyr)
      
      dt2 <- dt %>%
        mutate(org = group_indices(., x, y))
      
      dt2
        case x y org
      1    1 4 5   1
      2    2 4 5   1
      3    3 8 9   4
      4    4 7 9   3
      5    5 6 3   2
      6    6 6 3   2
      

      如果组号需要按顺序排列,我们可以在创建org列后使用data.table包中的rleid,如下所示。

      library(dplyr)
      library(data.table)
      
      dt2 <- dt %>%
        mutate(org = group_indices(., x, y)) %>%
        mutate(org = rleid(org))
      dt2
        case x y org
      1    1 4 5   1
      2    2 4 5   1
      3    3 8 9   2
      4    4 7 9   3
      5    5 6 3   4
      6    6 6 3   4
      

      更新

      这里是如何排列dplyr中的列。

      library(dplyr)
      
      dt %>%
        arrange(x)
        case x y
      1    1 4 5
      2    2 4 5
      3    5 6 3
      4    6 6 3
      5    4 7 9
      6    3 8 9
      

      我们也可以对多个列执行此操作,例如arrange(x, y) 或使用desc 反转顺序,例如arrange(desc(x))

      数据

      dt <- read.table(text = " case x y 
            1  4 5  
                       2  4 5  
                       3  8 9 
                       4  7 9
                       5  6 3
                       6  6 3",
                       header = TRUE)
      

      【讨论】:

      • 如果您使用rleid 更好arrange dt 在变异新列之前〜:)
      • @Wen 我觉得arrange 可能不是OP 想要的,因为OP 的示例输出没有考虑xy 的顺序。但对于 OP 来说仍然是有价值的信息来考虑和思考。
      • 老兄,试试这个例子,你会明白我的意思...A,A,B,A,C,D.rleid 将返回 1,1,2,3,4,5
      • @Wen 感谢您指出这一点。我没有考虑那个。我已经使用dplyr 中的group_indices 更新了我的代码,但我并没有考虑如何准确生成OP 想要的输出。
      • @Wen 感谢您的支持。我想也许我们可以在group_indices 之后使用rleid。这将生成 OP 想要的确切输出,并避免您指出的假设情况。
      猜你喜欢
      • 2021-11-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多