Как мне создать и применить функцию к определенным столбцам таблицы? - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь практиковать R и узнать больше в целом.Я хотел бы сделать соотношение х преступности на 100 000 человек.Ниже приводится глава моих данных.Я решил использовать только 5 крупнейших городов.

# A tibble: 6 x 13
City       Popula~ `Viol~ `Mur~ `Rap~ `Rap~ Robbe~ `Aggr~ `Prop~ Burgl~ `Larc~ `Moto~ Arson
 <chr>        <dbl>  <dbl> <dbl> <dbl> <lgl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
1 Abingdon      8186  10.0   0     3.00 NA      1.00   6.00  233    20.0  198    15.0   4.00
2 Alexandria  148519 258     5.00 21.0  NA    118    114    2967   249    2427   291    13.0 
3 Altavista     3486   8.00  0     0    NA      2.00   6.00   56.0   4.00   52.0   0     0   
4 Amherst       2223   2.00  0     2.00 NA      0      0      27.0   6.00   19.0   2.00  0   
5 Appalachia    1728  12.0   0     2.00 NA      2.00   8.00   77.0  25.0    51.0   1.00  0   
6 Ashland       7310  26.0   0     1.00 NA      8.00  17.0   246    14.0   221    11.0   1.00

Следующий код - моя попытка.

virginia_crime %>%
 filter(Population > 180000) %>%
 group_by(City) %>%
 summarise(ratio_violent = `Violent
 crime`/(Population/100000),
 ratio_murder = `Murder and
 nonnegligent
 manslaughter`/(Population/100000))

Вывод:

# A tibble: 5 x 3
City           ratio_violent ratio_murder
<chr>                  <dbl>        <dbl>
1 Chesapeake               320         3.90
2 Newport News             439         8.28
3 Norfolk                  573        11.3 
4 Richmond                 624        17.4 
5 Virginia Beach           162         3.77

Я понимаю,что я должен быть в состоянии сделать функцию, которая по существу создает скорость.Что-то вроде ... рейтинг <- (криминальные столбцы / (Население / 1000)). Я даже близок к своей идее или мне следует использовать одну из функций применения (sapply (резюмировать ()))? Мне кажется, эта задача могла быбыть автоматизированным как-то, я просто не могу понять это. Буду признателен за понимание </p>

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Вот вариант с mutate_at.В коде OP используется summarise, но он предназначен для суммирования объекта с 'n' строками в одну строку.Соотношение всегда будет не одной строкой (на основе кода ОП и вместо 10000 * следует использовать mutate)

library(dplyr)
df1 %>% 
   filter(Population > 180000) %>% 
   mutate_at(3:13, funs(./Population/100000))
0 голосов
/ 03 июня 2018

Сначала вы можете собрать свои столбцы (все, кроме города и населения), что позволит вам оперировать всеми ними одновременно:

library(tidyr)

crime_rates <- virginia_crime %>%
  filter(Population > 180000) %>%
  gather(Crime, Number, -City, -Population) %>%
  mutate(Rate = Number / (Population / 100000))

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

Если вы хотите превратить его в широкую форму, вы можете использовать спред (после удаления столбца Number):

crime_rates %>%
  select(-Number) %>%
  spread(Crime, Rate)

Стоит отметить, что собранная (прибранная) версия по-прежнему весьма полезна, например, если вы хотите найти города с наивысшими показателями каждого преступления (возможно, использовать на графике):

crime_rates %>%
  group_by(City) %>%
  top_n(1, Rate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...