В R мне нужно разделить набор чисел на определенное значение c в другом столбце, а затем повторить это действие сгруппированными переменными - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть некоторые образовательные данные, которые включают в себя названия школ, учебный год, этническую принадлежность, а также количество уроков и учеников, которые брали эти классы.

structure(list(SchoolName = c("BHS", "BHS", "BHS", "BHS", "BHS", 
"BHS"), CourseSchoolYear = c("2017-18", "2017-18", "2017-18", 
"2017-18", "2017-18", "2017-18"), Category = c("Asian", "Black", 
"Hispanic", "Other", "Overall", "White"), `Total Population` = c(129, 
53, 173, 133, 1932, 1444), `Theatre Classes` = c(9, 0, 11, 8, 
126, 98), `Music Classes` = c(73, 7, 91, 60, 990, 759), `Visual Arts Classes` = c(52, 
26, 69, 52, 770, 571), `Total Arts Classes` = c(167, 42, 203, 
144, 2359, 1803), `# of Students All Art` = c(90, 28, 106, 77, 
1241, 940), `# of Students Theatre` = c(7, 0, 8, 7, 97, 75), 
    `# of Students Music` = c(37, 4, 41, 27, 460, 351), `# of Students Visual Arts` = c(41, 
    19, 53, 40, 599, 446)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))

Вот фрагмент одной школы за один учебный год. Мне нужно разделить ценности каждой этнической принадлежности на общую численность населения. Но мне нужно сделать это для каждого типа курса. И затем мне нужно повторить это действие еще для 80 школ с данными за 5 лет в каждой. Я знаю, что должен быть какой-то тип l oop или функция, которую я мог бы написать, но я слишком новичок в программировании на R, чтобы понять это.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Если я правильно понимаю, все значения должны быть разделены на одно значение для школы и года, которое является Total Population в категории Overall.

Это требует изменения ответа akrun :

df3 <- df1 %>%
  group_by(SchoolName, CourseSchoolYear) %>%
  mutate_at(vars(`Theatre Classes`:`# of Students Visual Arts`),
            list(share =  ~ ./`Total Population`[Category == "Overall"]))

, который производит

df3 %>% 
  select(c(SchoolName:`Total Population`, ends_with("share")))
# A tibble: 6 x 12
# Groups:   SchoolName, CourseSchoolYear [1]
  SchoolName CourseSchoolYear Category `Total Populati… `Theatre Classe… `Music Classes_… `Visual Arts Cl… `Total Arts Cla…
  <chr>      <chr>            <chr>               <dbl>            <dbl>            <dbl>            <dbl>            <dbl>
1 BHS        2017-18          Asian                 129          0.00466          0.0378            0.0269           0.0864
2 BHS        2017-18          Black                  53          0                0.00362           0.0135           0.0217
3 BHS        2017-18          Hispanic              173          0.00569          0.0471            0.0357           0.105 
4 BHS        2017-18          Other                 133          0.00414          0.0311            0.0269           0.0745
5 BHS        2017-18          Overall              1932          0.0652           0.512             0.399            1.22  
6 BHS        2017-18          White                1444          0.0507           0.393             0.296            0.933 
# … with 4 more variables: `# of Students All Art_share` <dbl>, `# of Students Theatre_share` <dbl>, `# of Students
#   Music_share` <dbl>, `# of Students Visual Arts_share` <dbl>

Меня раздражает, что строка Overall появляется среди строк этнических групп. Вот способ сделать это последним рядом для каждой школы и года:

df3 <- df1 %>%
  mutate(Category = forcats::fct_relevel(Category, "Overall", after = Inf)) %>% 
  arrange(SchoolName, CourseSchoolYear, Category) %>% 
  group_by(SchoolName, CourseSchoolYear) %>%
  mutate_at(vars(`Theatre Classes`:`# of Students Visual Arts`),
            list(share =  ~ ./`Total Population`[Category == "Overall"]))

df3 %>% 
  select(c(SchoolName:`Total Population`, ends_with("share")))
# A tibble: 6 x 12
# Groups:   SchoolName, CourseSchoolYear [1]
  SchoolName CourseSchoolYear Category `Total Populati… `Theatre Classe… `Music Classes_… `Visual Arts Cl… `Total Arts Cla…
  <chr>      <chr>            <fct>               <dbl>            <dbl>            <dbl>            <dbl>            <dbl>
1 BHS        2017-18          Asian                 129          0.00466          0.0378            0.0269           0.0864
2 BHS        2017-18          Black                  53          0                0.00362           0.0135           0.0217
3 BHS        2017-18          Hispanic              173          0.00569          0.0471            0.0357           0.105 
4 BHS        2017-18          Other                 133          0.00414          0.0311            0.0269           0.0745
5 BHS        2017-18          White                1444          0.0507           0.393             0.296            0.933 
6 BHS        2017-18          Overall              1932          0.0652           0.512             0.399            1.22  
# … with 4 more variables: `# of Students All Art_share` <dbl>, `# of Students Theatre_share` <dbl>, `# of Students
#   Music_share` <dbl>, `# of Students Visual Arts_share` <dbl>
0 голосов
/ 05 февраля 2020

Если мы делим столбцы на основе общей численности населения

library(dplyr)
df2 <- df1 %>%
         group_by(SchoolName, CourseSchoolYear) %>%
         mutate_at(vars(`Theatre Classes`:`# of Students Visual Arts`),
                  list(perc =  ~ ./`Total Population`[Category == "Overall"]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...