Группировка данных в 12 группах с одинаковыми значениями столбцов

У меня большой набор данных с примерно 15 столбцами и более 3 миллионами строк.

Поскольку набор данных очень большой, я хотел бы использовать multidplyrв теме.

Из-за данных было бы невозможно просто разделить мой фрейм данных на 12 частей. Допустим, есть столбцы col1 а также col2 у каждого из которых есть несколько разных значений, но они повторяются (в каждом столбце отдельно).

Как я могу сделать 12 (или n) группы одинакового размера, каждая из которых содержит строки, имеющие одинаковое значение в обоих col1 а также col2?

Пример: скажем одно из возможных значений в col1foo И в col2 является bar, Тогда они будут сгруппированы, все строки с этими значениями будут в одной группе.

Так что вопрос имеет смысл, всегда есть более 12 уникальных комбинаций col1 а также col2,

Я бы попытался сделать что-то с циклами for и while, если это был python, но так как это RТам, вероятно, есть другой способ.

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.

Попробуй это:

# 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
Другие вопросы по тегам