【问题标题】:Grouping dataframe in 12 groups with same column values将数据框分组为 12 组,具有相同的列值
【发布时间】:2017-09-18 22:23:28
【问题描述】:

我有一个包含大约 15 列和超过 300 万行的大型数据集。

由于数据集太大,我想在上面使用multidplyr

由于数据的原因,不可能将我的数据框分成 12 个部分。假设有 col1col2 列,它们每个都有几个不同的值,但它们重复(分别在每一列中)。

如何创建 12 个(或 n)大小相似的组,每个组都包含在 col1col2 中具有相同值的行?

示例:假设col1 foocol2 中的一个可能值是bar。然后它们将被分组,具有此值的所有行都将在一个组中。

为了让这个问题有意义,col1col2 的唯一组合总是超过 12 个。

如果这是 python,我会尝试用 for 和 while 循环做一些事情,但因为这是 R,可能还有另一种方法。

【问题讨论】:

    标签: r multithreading dataframe multidplyr


    【解决方案1】:

    试试这个:

    # As you provided no example data, I created some data repeating three times.
    # I used dplyr within tidyverse. Then grouped by the columns and sliced 
    # the data by chance for n=2. 
    library(tidyverse)
    df <- data.frame(a=rep(LETTERS,3), b=rep(letters,3))
    # the data:
    df %>%
       arrange(a,b) %>% 
       group_by(a,b) %>% 
       mutate(n=1:n())
    # A tibble: 78 x 3
    # Groups:   a, b [26]
            a      b     n
       <fctr> <fctr> <int>
     1      A      a     1
     2      A      a     2
     3      A      a     3
     4      B      b     1
     5      B      b     2
     6      B      b     3
     7      C      c     1
     8      C      c     2
     9      C      c     3
    10      D      d     1
    # ... with 68 more rows
    

    在每组两行上随机切分数据。

    set.seed(123)
    df %>%
      arrange(a,b) %>% 
      group_by(a,b) %>% 
      mutate(n=1:n()) %>% 
      sample_n(2)
    # A tibble: 52 x 3
    # Groups:   a, b [26]
            a      b     n
       <fctr> <fctr> <int>
     1      A      a     1
     2      A      a     2
     3      B      b     2
     4      B      b     3
     5      C      c     3
     6      C      c     1
     7      D      d     2
     8      D      d     3
     9      E      e     2
    10      E      e     1
    # ... with 42 more rows
    

    【讨论】:

    • 谢谢,但我们可能互相误解了。我需要对我的所有数据进行分组,并且我需要将所有相同的数据放在一起。在这种情况下,对于 n = 2,我需要获得 2 个大小相似的组(因为 df 大小是偶数,大约 39),这将包括所有元素。所以在这种情况下,如果我们按字母顺序进行,从 A 到包括 M 的所有元素,而另一个将所有其他元素组合在一起。如果 n=3,一组的大小为 27(A 到 I),另一组也是(J 到 R),另一组的大小为 25(S 到 Z)。
    • @Ravonrip 抱歉,我不明白。请编辑您的问题并包含一些可重现的数据和您的预期输出。也检查一下question
    【解决方案2】:
    # Create sample data 
    library(dplyr)
    df <- data.frame(a=rep(LETTERS,3), b=rep(letters,3), 
                 nobs=sample(1:100, 26*3,replace=T), stringsAsFactors=F)
    
    # Get all unique combinations of col1 and col2
    combos <- df %>%
      group_by(a,b) %>% 
      summarize(n=sum(nobs)) %>% 
      as.data.frame(.) 
    
    top12 <- combos %>% 
      arrange(desc(n)) %>% 
      top_n(12,n)
    top12
    
    l <- list()
    for(i in 1:11){
      l[[i]] <- combos[combos$a==top12[i,"a"] & combos$b==top12[i,"b"],]
    }
    
    l[[12]] <- combos %>% 
      anti_join(top12,by=c("a","b")) 
    l
    
    # This produces a list 'l' that contains twelve data frames -- the top 11 most-commonly occuring pairs of col1 and col2, and all the rest of the data in the 12th list element.
    

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 2019-05-10
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2022-01-20
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多