【问题标题】:Frequency of each unique combination in data frame数据框中每个唯一组合的频率
【发布时间】:2018-02-01 12:01:34
【问题描述】:

在数据集 (N=6000) 中,我想分析(15 个虚拟)变量组合出现的频率。

ID       Var1        Var2       Var3    Var15

1          1          0          0        1

2          0          1          1        1

3          1          0          0        0

6000       1          0          0        0

对于这个例子,我希望看到组合 1000 出现两次,1001 出现一次,0111 也出现一次。

我能想到的唯一方法是为每个可能的组合计算一个变量...

有没有一种优雅而有效的方法来做到这一点?

我已通读 How to summarize all possible combinations of variables? 但这是一个稍微不同的问题,Aggregating Tally counters 超越了我的知识范围(但如果这是我问题的答案,我会解决的)。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以像这样使用count

    df = read.table(text = "
    ID       Var1        Var2       Var3    Var15
    1          1          0          0        1
    2          0          1          1        1
    3          1          0          0        0
    6000       1          0          0        0
    ", header=T)
    
    library(dplyr)
    
    df %>% count(Var1, Var2, Var3, Var15)
    
    # # A tibble: 3 x 5
    #     Var1  Var2  Var3 Var15     n
    #    <int> <int> <int> <int> <int>
    # 1     0     1     1     1     1
    # 2     1     0     0     0     2
    # 3     1     0     0     1     1
    

    如果您不想输入(很多)列名,请使用count_

    input_names = names(df)[-1]  # select all column names apart from 1st one
    
    df %>% count_(input_names)
    
    # # A tibble: 3 x 5
    #    Var1  Var2  Var3 Var15     n
    #   <int> <int> <int> <int> <int>
    # 1     0     1     1     1     1
    # 2     1     0     0     0     2
    # 3     1     0     0     1     1
    

    如果您想对变量进行分组并创建一个(组合)变量,您可以这样做:

    library(dplyr)
    library(tidyr)
    
    input_names = names(df)[-1]
    
    df %>% count_(input_names) %>% unite_("ComboVar",input_names,sep="")
    
    # # A tibble: 3 x 2
    #   ComboVar     n
    # * <chr>    <int>
    # 1 0111         1
    # 2 1000         2
    # 3 1001         1
    

    【讨论】:

    • 非常感谢您的快速回复。我会试试的。
    • 效果很好再次感谢您!
    • 我很困惑这有什么帮助,因为它不包含 0 次出现的组合?
    • @cs0815 他们清楚地指定了他们希望输出的样子,我的回答就是基于此。您应该尝试library(tidyverse); df %&gt;% count(Var1, Var2, Var3, Var15) %&gt;% complete(Var1, Var2, Var3, Var15, fill = list(n = 0)) 为不存在的组合获取零值。
    • @AntoniosK 谢谢 - 一定忽略了那部分 - 抱歉
    【解决方案2】:

    使用dplyr 包,您可以:

    library(dplyr)
    df %>% group_by(Var1, Var2, Var3, Var15) %>% tally
    

    【讨论】:

      【解决方案3】:

      基本的 R 解决方案是使用 table。使用 AntoniosK 的示例 df:

      df = read.table(text = "
      ID       Var1        Var2       Var3    Var15
      1          1          0          0        1
      2          0          1          1        1
      3          1          0          0        0
      6000       1          0          0        0
      ", header=T)
      
      res <- as.data.frame(table(df[,2:5]))
      
      #> res
      #   Var1 Var2 Var3 Var15 Freq
      #1     0    0    0     0    0
      #2     1    0    0     0    2
      #3     0    1    0     0    0
      #4     1    1    0     0    0
      #5     0    0    1     0    0
      #6     1    0    1     0    0
      #7     0    1    1     0    0
      #8     1    1    1     0    0
      #9     0    0    0     1    0
      #10    1    0    0     1    1
      #11    0    1    0     1    0
      #12    1    1    0     1    0
      #13    0    0    1     1    0
      #14    1    0    1     1    0
      #15    0    1    1     1    1
      #16    1    1    1     1    0
      

      与其他示例不同,这为您提供了零频率。如果你不想要那些零频率的例子,那么你可以简单地做:

      res[res$Freq>0,]
      

      【讨论】:

        【解决方案4】:

        SPSS 解决方案也是简单地聚合。 以下语法会将计数放入新数据集中:

        DATASET DECLARE comb.
        AGGREGATE  /OUTFILE='comb' /BREAK=var1 to var15 /Noccurences=N.
        

        您也可以像这样将计数添加到当前数据集:

        AGGREGATE /OUTFILE=* MODE=ADDVARIABLES /BREAK=var1 var2 var3 /Noccurences=N.
        

        【讨论】:

          【解决方案5】:

          plyr 选项:

          plyr::count(df[-1])
          
          #   Var1 Var2 Var3 Var15 freq
          #1    0    1    1     1    1
          #2    1    0    0     0    2
          #3    1    0    0     1    1
          

          【讨论】:

            猜你喜欢
            • 2023-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-12
            • 1970-01-01
            • 1970-01-01
            • 2022-11-04
            • 1970-01-01
            相关资源
            最近更新 更多