Подтвердить что ты не робот

Применение 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 и суммировать ", но ни один из адресов не является моей проблемой.

4b9b3361

Ответ 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