Как я могу использовать dplyr, чтобы урезать свои данные и суммировать в среднем за год? - PullRequest
1 голос
/ 02 февраля 2020

Я учусь dplyr и работаю над суммированием, фильтрацией и группировкой.

У меня есть набор данных "set2 c", который содержит данные переписи для названия города, штата, года, общей численности населения, всего население, общее по полу и в среднем по городу и году:

https://share.getcloudapp.com/o0uQnyGn

Продолжая, я пытаюсь найти население штатов, агрегируя с суммой населения каждого города. Я хотел бы видеть новый столбец "stateAvePop", в котором суммирована средняя численность населения для каждого штата.

set2d <- set2c %>%
  group_by(YEAR,STNAME,totalAll,totalMale,totalFemale) %>%
  summarize(stateavepop = sum(avgpop))
set2d

https://share.getcloudapp.com/Z4uw0epe

Но я думаю, что я нужно сортировать по состоянию как-то, когда я пытаюсь получить среднюю сумму. Кто-нибудь, пожалуйста, посмотрите, где я иду не так?

head (set2 c, 20) возвращает:

# A tibble: 20 x 7
# Groups:   CTYNAME, YEAR, STNAME, totalAll, totalMale [20]
   CTYNAME           YEAR STNAME         totalAll totalMale totalFemale avgpop
   <fct>            <int> <fct>             <int>     <int>       <int>  <dbl>
 1 Abbeville County    10 South Carolina    24560     11895       12665  24560
 2 Abbeville County    11 South Carolina    24541     11868       12673  24541
 3 Acadia Parish       10 Louisiana         62514     30405       32109  62514
 4 Acadia Parish       11 Louisiana         62190     30342       31848  62190
 5 Accomack County     10 Virginia          32566     15871       16695  32566
 6 Accomack County     11 Virginia          32412     15817       16595  32412
 7 Ada County          10 Idaho            456885    228715      228170 456885
 8 Ada County          11 Idaho            469966    235266      234700 469966
 9 Adair County        10 Iowa               7053      3503        3550   7053
10 Adair County        10 Kentucky          19294      9578        9716  19294
11 Adair County        10 Missouri          25306     12183       13123  25306
12 Adair County        10 Oklahoma          21981     10981       11000  21981
13 Adair County        11 Iowa               7063      3509        3554   7063
14 Adair County        11 Kentucky          19215      9508        9707  19215
15 Adair County        11 Missouri          25339     12194       13145  25339
16 Adair County        11 Oklahoma          22082     11015       11067  22082
17 Adams County        10 Colorado         504428    254651      249777 504428
18 Adams County        10 Idaho              4132      2129        2003   4132
19 Adams County        10 Illinois          66094     32521       33573  66094
20 Adams County        10 Indiana           35422     17683       17739  35422

1 Ответ

1 голос
/ 02 февраля 2020

Исходя из примера обновленных данных OP, нам нужно сгруппировать только по 'STNAME'

library(dplyr)
set2c %>%
     group_by(STNAME) %>% 
     summarise(totalAll = sum(totalAll), avppop = mean(avgpop))
# A tibble: 11 x 3
#   STNAME         totalAll  avppop
#   <chr>             <int>   <dbl>
# 1 Colorado         504428 504428 
# 2 Idaho            930983 310328.
# 3 Illinois          66094  66094 
# 4 Indiana           35422  35422 
# 5 Iowa              14116   7058 
# 6 Kentucky          38509  19254.
# 7 Louisiana        124704  62352 
# 8 Missouri          50645  25322.
# 9 Oklahoma          44063  22032.
#10 South Carolina    49101  24550.
#11 Virginia          64978  32489 

Если вы хотите выбрать определенные столбцы при создании новых столбцов, используйте transmute вместо summarise

set2c %>%
      group_by(STNAME) %>% 
      transmute(totalAll, totalAllSum = sum(totalAll), avppop = mean(avgpop))
# A tibble: 20 x 4
# Groups:   STNAME [11]
#   STNAME         totalAll totalAllSum  avppop
#   <chr>             <int>       <int>   <dbl>
# 1 South Carolina    24560       49101  24550.
# 2 South Carolina    24541       49101  24550.
# 3 Louisiana         62514      124704  62352 
# 4 Louisiana         62190      124704  62352 
# 5 Virginia          32566       64978  32489 
# 6 Virginia          32412       64978  32489 
# 7 Idaho            456885      930983 310328.
# 8 Idaho            469966      930983 310328.
# 9 Iowa               7053       14116   7058 
#10 Kentucky          19294       38509  19254.
#11 Missouri          25306       50645  25322.
#12 Oklahoma          21981       44063  22032.
#13 Iowa               7063       14116   7058 
#14 Kentucky          19215       38509  19254.
#15 Missouri          25339       50645  25322.
#16 Oklahoma          22082       44063  22032.
#17 Colorado         504428      504428 504428 
#18 Idaho              4132      930983 310328.
#19 Illinois          66094       66094  66094 
#20 Indiana           35422       35422  35422 

данные

set2c <- structure(list(CTYNAME = c("Abbeville County", "Abbeville County", 
"Acadia Parish", "Acadia Parish", "Accomack County", "Accomack County", 
"Ada County", "Ada County", "Adair County", "Adair County", "Adair County", 
"Adair County", "Adair County", "Adair County", "Adair County", 
"Adair County", "Adams County", "Adams County", "Adams County", 
"Adams County"), YEAR = c(10L, 11L, 10L, 11L, 10L, 11L, 10L, 
11L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 10L, 10L, 10L, 10L
), STNAME = c("South Carolina", "South Carolina", "Louisiana", 
"Louisiana", "Virginia", "Virginia", "Idaho", "Idaho", "Iowa", 
"Kentucky", "Missouri", "Oklahoma", "Iowa", "Kentucky", "Missouri", 
"Oklahoma", "Colorado", "Idaho", "Illinois", "Indiana"), totalAll = c(24560L, 
24541L, 62514L, 62190L, 32566L, 32412L, 456885L, 469966L, 7053L, 
19294L, 25306L, 21981L, 7063L, 19215L, 25339L, 22082L, 504428L, 
4132L, 66094L, 35422L), totalMale = c(11895L, 11868L, 30405L, 
30342L, 15871L, 15817L, 228715L, 235266L, 3503L, 9578L, 12183L, 
10981L, 3509L, 9508L, 12194L, 11015L, 254651L, 2129L, 32521L, 
17683L), totalFemale = c(12665L, 12673L, 32109L, 31848L, 16695L, 
16595L, 228170L, 234700L, 3550L, 9716L, 13123L, 11000L, 3554L, 
9707L, 13145L, 11067L, 249777L, 2003L, 33573L, 17739L), avgpop = c(24560L, 
24541L, 62514L, 62190L, 32566L, 32412L, 456885L, 469966L, 7053L, 
19294L, 25306L, 21981L, 7063L, 19215L, 25339L, 22082L, 504428L, 
4132L, 66094L, 35422L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...