Как использовать group_by в r, чтобы объединить строки фрейма данных по некоторым столбцам, но сохранить и другие столбцы - PullRequest
0 голосов
/ 18 июня 2020

Это должно быть просто, я просто не могу заставить его работать

У меня есть фрейм данных all_emissions_state_total, который выглядит примерно так:

tribe    state      scc       pollutant      emissions     unit     category    eis     year     fraction 
NA       WY         707       Methane        546           TON      onroad      NA      2011     NA
NA       WY         707       Methane        38            TON      onroad      NA      2011     NA
NA       WY         3405      Methane        2937          TON      onroad      NA      2011     NA
NA       MT         707       Methane        665           TON      onroad      NA      2011     NA
NA       WY         390       CO2            740           TON      onroad      NA      2011     NA
NA       MT         390       CO2            12            TON      onroad      NA      2011     NA
NA       WY         3405      Methane        329           TON      onroad      NA      2011     NA
GHYU     WY         390       CO2            44            TON      point       NA      2011     NA
BERS     WY         390       CO2            64445         TON      point       NA      2011     596
SDSH     KS         707       Methane        123           TON      point       NA      2011     3890
SDSH     MT         707       Methane        58            TON      point       NA      2011     112

И я хочу, чтобы он выглядят так:

state       scc        pollutant        emissions        unit        year
WY          707        Methane          584              TON         2011
MT          707        Methane          723              TON         2011
WY          3405       Methane          3266             TON         2011
WY          390        CO2              65229            TON         2011
MT          390        CO2              12               TON         2011
KS          707        Methane          123              TON         2011

В исходном фрейме данных all_emissions_state_total, tribe, state, scc, pollutant, emissions, category, eis и fraction различаются. unit всегда TON, а year всегда 2011.

Я хочу, чтобы строки были сгруппированы по строкам с одинаковыми state, scc и pollutant, а также для столбец emissions должен быть суммой тех строк, которые группируются. tribe, category, eis и fraction не имеют значения и могут быть отброшены, но unit и year должны остаться.

Вот что, как я думал, сработает:

all_emissions_state <- all_emissions_state_total %>%
                                group_by( state, scc, pollutant ) %>% 
                                summarise( emissions = sum( emissions ) )

, но мой вывод для этого - фрейм данных 1x1 all_emissions_state, который имеет столбец emissions и 1 значение, которое является суммой всех выбросов из фрейма данных.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Один вариант в Базе

    New_df <- do.call(rbind,lapply(split(df, with(df,paste0(state,scc,pollutant))), function(x) x[1,c("state","scc","pollutant","emissions","unit","year")]))
    New_df$emissions <- sapply( split(df$emissions, with(df,paste0(state,scc,pollutant))), sum)
    row.names(New_df) <- NULL

> New_df
  state  scc pollutant emissions unit year
1    KS  707   Methane       123  TON 2011
2    MT  390       CO2        12  TON 2011
3    MT  707   Methane       723  TON 2011
4    WY 3405   Methane      3266  TON 2011
5    WY  390       CO2     65229  TON 2011
6    WY  707   Methane       584  TON 2011
0 голосов
/ 18 июня 2020

Это должно работать, если единицы измерения в год постоянны для всей группы. Попробуйте поставить dplyr :: sumarise (), возможно, у вас конфликт функций.

all_emissions_state <- all_emissions_state_total %>%
      dplyr::group_by(state, scc, pollutant) %>% 
      dplyr::summarise( 
         emissions = sum(emissions),
         unit = dplyr::first(unit),
         year = dplyr::first(year)
    )
...