将数据帧分组为具有相同列值的12个组

时间:2017-09-18 13:25:41

标签: r multithreading dataframe multidplyr

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

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

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

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

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

为了使问题有意义,col1col2总共有12种以上的独特组合。

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

2 个答案:

答案 0 :(得分:0)

试试这个:

# 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

答案 1 :(得分:0)

# 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.