R - dplyr суммировать и сохранить другие столбцы

Я группирую данные, а затем резюмирую их, но также хотел бы сохранить еще один столбец. Мне не нужно выполнять какие-либо оценки содержимого этого столбца, поскольку он всегда будет таким же, как столбец group_by. Я могу добавить его в оператор group_by, но это не кажется «правильным». Я хочу сохранить State.Full.Name после группировки по State. Спасибо

TDAAtest <- data.frame(State=sample(state.abb,1000,replace=TRUE))
TDAAtest$State.Full.Name <- state.name[match(TDAAtest$State,state.abb)]


TDAA.states <- TDAAtest %>%
  filter(!is.na(State)) %>%
  group_by(State) %>%
  summarize(n=n()) %>%
  ungroup() %>%
  arrange(State)

person atclaus    schedule 23.08.2016    source источник
comment
Какой столбец вы хотите summarise? Исходя из кода, вы делаете это по обоим столбцам   -  person akrun    schedule 23.08.2016
comment
Вероятно, лучше всего сгруппировать по обоим. Альтернатива - summarize(State.Full.Name = unique(State.Full.Name), n=n()), менее краткая.   -  person alistaire    schedule 23.08.2016
comment
@akrun я уточнил. Я ушел в своем не очень правильном подходе.   -  person atclaus    schedule 23.08.2016
comment
Кроме того, count(...) эквивалентно group_by(...) %>% summarise(n = n())   -  person alistaire    schedule 23.08.2016


Ответы (2)


Возможно нам понадобится

TDAAtest %>% 
     filter(!is.na(State)) %>%
     group_by(State) %>% 
     summarise(State.Full.Name = first(State.Full.Name), n = n())

Или используйте mutate для создания столбца, а затем выполните distinct

TDAAtest %>% f
     filter(!is.na(State)) %>%
     group_by(State) %>% 
     mutate(n= n()) %>% 
     distinct(State, .keep_all=TRUE)
person akrun    schedule 23.08.2016

Я считаю, что есть более точные ответы, чем принятый ответ, особенно когда у вас нет уникальных данных для других столбцов в каждой группе (например, max или min или верхние n элементов на основе одного конкретного столбца).

Хотя принятый ответ подходит для этого вопроса, например, вы хотите найти округ с максимальным населением для каждого штата. (Вам необходимо иметь столбцы county и population).

У нас есть следующие варианты:

1. версия dplyr

Из этой ссылки у вас есть три дополнительных операции (mutate, ungroup и filter) для этого:

TDAAtest %>% 
     filter(!is.na(State)) %>%
     group_by(State) %>% 
     mutate(maxPopulation = max(Population)) %>% 
     ungroup() %>%
     filter(maxPopulation == Population)

2. Версия функции

Это дает вам столько гибкости, сколько вы хотите, и вы можете применять любые операции к каждой группе:

maxFUN = function(x) {
  # order population in a descending order
  x = x[with(x, order(-Population)), ]
  x[1, ]
}

TDAAtest %>% 
     filter(!is.na(State)) %>%
     group_by(State) %>%
     do(maxFUN(.)) 

Это настоятельно рекомендуется для более сложных операций. Например, вы можете вернуть верхние n (topN) округов для каждого штата, указав x[1:topN] для возвращенного фрейма данных в maxFUN.

person Habib Karbasian    schedule 23.06.2021