Как сгруппировать символьный вектор в R, который содержит общую строку символов? - PullRequest
1 голос
/ 05 февраля 2020

У меня есть фрейм данных, содержащий столбец с именем charge, содержащий вектор символов и столбец с именем n, который является вектором чисел c. Следующие данные являются примером того, что у меня есть

charge<-c('unlawful possession of a firearm',
          'unlawful possession of a firearm repealed: 12-31-2016',
          'accessory unlawful possession of a firearm',
          'unlawful possession of drug paraphernalia',
          'unlawful possession of drug paraphernalia - prior drug offense',
          '579.074579.074579.074unlawful possession of drug paraphernalia')
n<-c(3904,4,2,2500,4,11)

df<-data.frame(charge,n)

                                                      charge    n
1                               unlawful possession of a firearm 3904
2          unlawful possession of a firearm repealed: 12-31-2016    4
3                     accessory unlawful possession of a firearm    2
4                      unlawful possession of drug paraphernalia 2500
5 unlawful possession of drug paraphernalia - prior drug offense    4
6 579.074579.074579.074unlawful possession of drug paraphernalia   11

Как вы можете видеть, вектор символов имеет набор кодов заряда, которые содержат две общие фразы незаконное владение огнестрельным оружием и незаконное хранение принадлежностей для наркотиков . Однако я хочу сгруппировать их под общими фразами, чтобы это выглядело следующим образом. Как мне это сделать?

                       charge    n
1          unlawful possession of a firearm 3910
2 unlawful possession of drug paraphernalia 2515

1 Ответ

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

Мы можем извлечь часть строки с помощью str_extract, использовать ее как переменную группировки и получить sum из 'n'. Здесь в качестве шаблона используется слово «незаконный», за которым следуют пробел и другие символы, пока мы не сопоставим ни «огнестрельное оружие», ни «принадлежности к наркотикам»

library(dplyr)
library(stringr)
df %>% 
  group_by(charge = str_extract(charge,
       "unlawful\\s+.*(firearm|drug paraphernalia)")) %>% 
  summarise(n = sum(n))
# A tibble: 2 x 2
#  charge                                        n
#  <chr>                                     <dbl>
#1 unlawful possession of a firearm           3910
#2 unlawful possession of drug paraphernalia  2515
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...