【问题标题】:How to find the mode across rows in R如何在 R 中跨行查找模式
【发布时间】:2021-07-02 12:52:45
【问题描述】:

我在 r 中有一个数据框,其中包含有关客户去年购买历史的信息,该数据框看起来像这样:

Client | Prod A | Prod B | Prod C
---------------------------------
  A    |   1    |    0   |   1
  B    |   1    |    1   |   0
  C    |   1    |    0   |   1 
  D    |   0    |    0   |   1
  E    |   1    |    0   |   0
---------------------------------

其中 1 表示客户在某个时间点购买了该产品,而 0 表示根本没有购买。

在这个特定的表格中,最常见的组合是产品 A 和产品 C,5 个案例中有 2 个案例。 我想找到一种方法/函数,它可以让我得到最常见的产品组合,用于这种类型的任何维度的数据框。 提前感谢您的帮助。

【问题讨论】:

  • 你想知道只有长度 2 的组合还是任何长度的组合?

标签: r


【解决方案1】:
res <- as.data.frame(xtabs(~., data=dat[,-1]))
res
#   Prod.A Prod.B Prod.C Freq
# 1      0      0      0    0
# 2      1      0      0    1
# 3      0      1      0    0
# 4      1      1      0    1
# 5      0      0      1    1
# 6      1      0      1    2
# 7      0      1      1    0
# 8      1      1      1    0

从这里你可以看到组合的数量,其中的“最大值”是

subset(res, Freq == max(Freq))
#   Prod.A Prod.B Prod.C Freq
# 6      1      0      1    2

【讨论】:

    【解决方案2】:

    df 中的数据框

    aggregate(Client~Prod.A+Prod.B+Prod.C,df,length)
    
      Prod.A Prod.B Prod.C Client
    1      1      0      0      1
    2      1      1      0      1
    3      0      0      1      1
    4      1      0      1      2
    

    客户给出计数的最后一列

    【讨论】:

      【解决方案3】:

      使用 dplyr 的解决方案

      library(dplyr)
      df <- data.frame(Client = c("A","B","C","D","E"),
                       `Prod A` = c(1,1,1,0,1),
                       `Prod B` = c(0,1,0,0,0),
                       `Prod C` = c(1,0,1,1,0))
      
      df %>%
           dplyr::group_by(Prod.A,Prod.B,Prod.C) %>%
           dplyr::summarise(count = n())
      # A tibble: 4 x 4
      # Groups:   Prod.A, Prod.B [3]
        Prod.A Prod.B Prod.C count
         <dbl>  <dbl>  <dbl> <int>
      1      0      0      1     1
      2      1      0      0     1
      3      1      0      1     2
      4      1      1      0     1
      

      【讨论】:

        【解决方案4】:
        library(dplyr)
        
        df <- data.frame(Client = c("A", "B", "C", "D", "E"), 
                         `Prod A` = c(1, 1, 1, 0, 1),
                         `Prod B` = c(0, 1, 0, 0, 0),
                         `Prod C` = c(1, 0, 1, 1, 0))
        
        df %>%
          rowwise() %>%
          mutate(length = sum(Prod.A, Prod.B, Prod.C)) %>%
          group_by(Prod.A, Prod.B, Prod.C) %>%
          mutate(count = n()) %>%
          ungroup() %>%
          filter(count == max(count) & length > 1) %>%
          select(1:4)
        

        这将产生:

          Client Prod.A Prod.B Prod.C
          <chr>   <dbl>  <dbl>  <dbl>
        1 A           1      0      1
        2 C           1      0      1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          • 2019-06-26
          相关资源
          最近更新 更多