Группировка данных в 12 группах с одинаковыми значениями столбцов
У меня большой набор данных с примерно 15 столбцами и более 3 миллионами строк.
Поскольку набор данных очень большой, я хотел бы использовать multidplyr
в теме.
Из-за данных было бы невозможно просто разделить мой фрейм данных на 12 частей. Допустим, есть столбцы col1
а также col2
у каждого из которых есть несколько разных значений, но они повторяются (в каждом столбце отдельно).
Как я могу сделать 12 (или n
) группы одинакового размера, каждая из которых содержит строки, имеющие одинаковое значение в обоих col1
а также col2
?
Пример: скажем одно из возможных значений в col1
foo
И в 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