Сгруппируйте по некоторой переменной в DF

#r #dataframe #tidyverse

Вопрос:

У меня есть DF и я хочу добавить новый столбец ( RESULT ).

 COUNTRY<- c('USA','USA','USA','USA','USA','USA','USA','USA','USA','UK','UK','UK','UK','GERMANY','GERMANY','GERMANY','GERMANY','GERMANY','GERMANY')
CITY<- c('NEW YORK','LOS ANGELES','CHICAGO','HOUSTON','PHOENIX','PHILADELPHIA','SAN ANTONIO','SAN DIEGO','DALLAS','LONDON','CAMBRIDGE','LIVERPOOL','MANCHESTER','BERLIN','HAMBURG','FRANKFURT','COLOGNE','STUTTGART','HANNOVER')
BMW_CAR<- c(25,46,176,22,22,25,881,133,339,177,29,175,165,165,617,350,232,14,778)
RESULT<- c(1644,1623,1493,1647,1647,1644,788,1536,1330,369,517,371,381,1991,1539,1806,1924,2142,1378)
DF <- data.frame(COUNTRY,CITY,BMW_CAR,RESULT)
 

Этот столбец рассчитывается ( RESULT ) из уравнения: сумма BMW_CAR из каждой страны минус сама строка. То есть группирование по некоторой переменной в DF.
Exemple:

  • сумма США составляет 1669 минус первая строка 25 = 1644
  • сумма США составляет 1669 минус вторая строка 46 = 1623
  • сумма Великобритании составляет 546 минус десятая строка 177 = 369
  • сумма ГЕРМАНИИ равна 2156 минус 18-я строка 14 = 2142 и т. Д….

Я попытался использовать group_by/summary, но это не сработало. Кто-нибудь может помочь мне добавить RESULT колонку?

Ответ №1:

Базовый вариант R использует ave

 
> transform(
    DF,
    RESULT2 = ave(BMW_CAR,COUNTRY,FUN = sum)-BMW_CAR
  )
   COUNTRY         CITY BMW_CAR RESULT RESULT2
1      USA     NEW YORK      25   1644    1644
2      USA  LOS ANGELES      46   1623    1623
3      USA      CHICAGO     176   1493    1493
4      USA      HOUSTON      22   1647    1647
5      USA      PHOENIX      22   1647    1647
6      USA PHILADELPHIA      25   1644    1644
7      USA  SAN ANTONIO     881    788     788
8      USA    SAN DIEGO     133   1536    1536
9      USA       DALLAS     339   1330    1330
10      UK       LONDON     177    369     369
11      UK    CAMBRIDGE      29    517     517
12      UK    LIVERPOOL     175    371     371
13      UK   MANCHESTER     165    381     381
14 GERMANY       BERLIN     165   1991    1991
15 GERMANY      HAMBURG     617   1539    1539
16 GERMANY    FRANKFURT     350   1806    1806
17 GERMANY      COLOGNE     232   1924    1924
18 GERMANY    STUTTGART      14   2142    2142
19 GERMANY     HANNOVER     778   1378    1378
 

Или вы можете попробовать group_by , как показано ниже

 DF %>%
  group_by(COUNTRY) %>%
  mutate(RESULT2 = sum(BMW_CAR) - BMW_CAR) %>%
  ungroup()
 

и вы увидите

 > DF %>%
    group_by(COUNTRY) %>%
    mutate(RESULT2 = sum(BMW_CAR) - BMW_CAR) %>%
    ungroup()
# A tibble: 19 x 5
   COUNTRY CITY         BMW_CAR RESULT RESULT2
   <chr>   <chr>          <dbl>  <dbl>   <dbl>
 1 USA     NEW YORK          25   1644    1644
 2 USA     LOS ANGELES       46   1623    1623
 3 USA     CHICAGO          176   1493    1493
 4 USA     HOUSTON           22   1647    1647
 5 USA     PHOENIX           22   1647    1647
 6 USA     PHILADELPHIA      25   1644    1644
 7 USA     SAN ANTONIO      881    788     788
 8 USA     SAN DIEGO        133   1536    1536
 9 USA     DALLAS           339   1330    1330
10 UK      LONDON           177    369     369
11 UK      CAMBRIDGE         29    517     517
12 UK      LIVERPOOL        175    371     371
13 UK      MANCHESTER       165    381     381
14 GERMANY BERLIN           165   1991    1991
15 GERMANY HAMBURG          617   1539    1539
16 GERMANY FRANKFURT        350   1806    1806
17 GERMANY COLOGNE          232   1924    1924
18 GERMANY STUTTGART         14   2142    2142
19 GERMANY HANNOVER         778   1378    1378
 

Комментарии:

1. Спасибо!. Я не знал о коде разгруппировки.

Ответ №2:

С library(dplyr) ,

 DF %>% group_by(COUNTRY) %>% mutate(RESULT2 =  sum(BMW_CAR)-BMW_CAR)
 

дает,

  COUNTRY CITY         BMW_CAR RESULT RESULT2
   <fct>   <fct>          <dbl>  <dbl>   <dbl>
 1 USA     NEW YORK          25   1644    1644
 2 USA     LOS ANGELES       46   1623    1623
 3 USA     CHICAGO          176   1493    1493
 4 USA     HOUSTON           22   1647    1647
 5 USA     PHOENIX           22   1647    1647
 6 USA     PHILADELPHIA      25   1644    1644
 7 USA     SAN ANTONIO      881    788     788
 

….

Ответ №3:

используйте data.table пакет

 library(data.table)
DF <- as.data.table(DF)  ## conv to data.table
DF[, NewResult := sum(BMW_CAR) - BMW_CAR, by = COUNTRY]

# out:
DF
    COUNTRY         CITY BMW_CAR RESULT NewResult
 1:     USA     NEW YORK      25   1644      1644
 2:     USA  LOS ANGELES      46   1623      1623
 3:     USA      CHICAGO     176   1493      1493
 4:     USA      HOUSTON      22   1647      1647
 5:     USA      PHOENIX      22   1647      1647
 6:     USA PHILADELPHIA      25   1644      1644
 7:     USA  SAN ANTONIO     881    788       788
 8:     USA    SAN DIEGO     133   1536      1536
 9:     USA       DALLAS     339   1330      1330
10:      UK       LONDON     177    369       369
11:      UK    CAMBRIDGE      29    517       517
12:      UK    LIVERPOOL     175    371       371
13:      UK   MANCHESTER     165    381       381
14: GERMANY       BERLIN     165   1991      1991
15: GERMANY      HAMBURG     617   1539      1539
16: GERMANY    FRANKFURT     350   1806      1806
17: GERMANY      COLOGNE     232   1924      1924
18: GERMANY    STUTTGART      14   2142      2142
19: GERMANY     HANNOVER     778   1378      1378