#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