Применение group_by и суммирование данных при сохранении всех данных столбцов
У меня есть большой набор данных с 22000 строк и 25 столбцов. Я пытаюсь сгруппировать свой набор данных на основе одного из столбцов и принять значение min другого столбца на основе сгруппированного набора данных. Однако проблема в том, что она дает мне только два столбца, содержащие сгруппированный столбец, а столбец имеет значение min... но мне нужна вся информация других столбцов, связанных с строками с минимальными значениями.
Вот простой пример, чтобы сделать его воспроизводимым:
data<- data.frame(a=1:10, b=c("a","a","a","b","b","c","c","d","d","d"), c=c(1.2, 2.2, 2.4, 1.7, 2.7, 3.1, 3.2, 4.2, 3.3, 2.2), d= c("small", "med", "larg", "larg", "larg", "med", "small", "small", "small", "med"))
d<- data %>%
group_by(b) %>%
summarise(min_values= min(c))
d
b min_values
1 a 1.2
2 b 1.7
3 c 3.1
4 d 2.2
Итак, мне нужно также иметь информацию, относящуюся к столбцам a и d, однако, поскольку у меня есть дублирование в значениях в столбце c, я не могу объединить их на основе столбца min_value... Мне было интересно, есть ли какие-либо способ сохранить информацию других столбцов, когда мы используем пакет dplyr.
Я нашел здесь несколько объяснений dplyr: group_by, подмножество и подведение итогов "и здесь" Поиск процента в суб -группы с использованием group_by и суммировать ", но ни один из адресов не является моей проблемой.
Ответы
Ответ 1
Вот два варианта: a) filter
и b) slice
из dplyr. В этом случае для каждой из групп нет дублированных минимальных значений в столбце c
, поэтому результаты а) и б) совпадают. Если бы были дублированные минимумы, подходите к а) возвратите каждый минимум на группу, а b) вернет только один минимум (первый) в каждой группе.
а)
> data %>% group_by(b) %>% filter(c == min(c))
#Source: local data frame [4 x 4]
#Groups: b
#
# a b c d
#1 1 a 1.2 small
#2 4 b 1.7 larg
#3 6 c 3.1 med
#4 10 d 2.2 med
Или аналогично
> data %>% group_by(b) %>% filter(min_rank(c) == 1L)
#Source: local data frame [4 x 4]
#Groups: b
#
# a b c d
#1 1 a 1.2 small
#2 4 b 1.7 larg
#3 6 c 3.1 med
#4 10 d 2.2 med
б)
> data %>% group_by(b) %>% slice(which.min(c))
#Source: local data frame [4 x 4]
#Groups: b
#
# a b c d
#1 1 a 1.2 small
#2 4 b 1.7 larg
#3 6 c 3.1 med
#4 10 d 2.2 med
Ответ 2
Вы можете использовать group_by
без summarize
:
data %>%
group_by(b) %>%
mutate(min_values = min(c)) %>%
ungroup()
Ответ 3
Использование sqldf
:
library(sqldf)
# Two options:
sqldf('SELECT * FROM data GROUP BY b HAVING min(c)')
sqldf('SELECT a, b, min(c) min, d FROM data GROUP BY b')
Вывод:
a b c d
1 1 a 1.2 small
2 4 b 1.7 larg
3 6 c 3.1 med
4 10 d 2.2 med