Использование суммирования для получения процента выбранных подгрупп - PullRequest
1 голос
/ 09 июля 2020

У меня есть следующий фрейм данных:

df <- data.frame(Mode = c("air", "water", "rail", "road", "air", "water", "rail", "road", "air", "water", "rail", "road"), Year = c("2000", "2000", "2000", "2000", "2001", "2001", "2001", "2001", "2002", "2002", "2002", "2002"), Country = c("USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "Germany", "Germany", "Germany", "Germany" ), VALUE = c(2, 3, NaN, 5, 1, NaN, 12, 19, 29, 30, 31, 32))

Цель состоит в том, чтобы получить процент определенных / выбранных подгрупп (вид транспорта). В этом случае я хочу получить для данного года и страны, какова доля / процент железнодорожных и водных ресурсов, а также, в другом случае, все остальные подгруппы, кроме автомобильного транспорта (т.е. воздух + вода + железная дорога).

Таким образом, в этом случае для 2000 года в США процент железных дорог и воды составляет 3 + 0 / (2 + 3 + 5) * 100 = 30%, а для недорожной подгруппы (без учета NaN) 2 + 3 / ( 2 + 3 + 5) * 100 = 50%

Моя отправная точка такова - игнорирование выбранной группировки, но затем я потерялся:

df %>% 
 na.omit() %>% 
 group_by(Year) %>% 
 mutate(pct = (VALUE/sum(VALUE) * 100))

Любой может руководить логикой / или думаешь, решая это?

1 Ответ

1 голос
/ 09 июля 2020

Думаю, у вас есть лог c. Я заменил NA на 0 только для того, чтобы сохранить их в df. Затем сгруппируйте по годам и странам, как вы понимаете. Наконец, используйте [], чтобы выбрать только часть вашего вектора.

require(dplyr)

df %>% 
  mutate(VALUE=replace_na(VALUE,0)) %>% 
  group_by(Year,Country) %>% 
  mutate(rail_water = sum(VALUE[Mode %in% c('rail','water')])/sum(VALUE),
         non_road = sum(VALUE[!Mode %in% c('road')])/sum(VALUE))

# A tibble: 12 x 6
# Groups:   Year, Country [3]
   Mode  Year  Country VALUE rail_water non_road
   <fct> <fct> <fct>   <dbl>      <dbl>    <dbl>
 1 air   2000  USA         2      0.3      0.5  
 2 water 2000  USA         3      0.3      0.5  
 3 rail  2000  USA         0      0.3      0.5  
 4 road  2000  USA         5      0.3      0.5  
 5 air   2001  USA         1      0.375    0.406
 6 water 2001  USA         0      0.375    0.406
 7 rail  2001  USA        12      0.375    0.406
 8 road  2001  USA        19      0.375    0.406
 9 air   2002  Germany    29      0.5      0.738
10 water 2002  Germany    30      0.5      0.738
11 rail  2002  Germany    31      0.5      0.738
12 road  2002  Germany    32      0.5      0.738

...