Как я могу объединить данные с одним и тем же именем в одном наборе данных (возможно, с помощью stringr)? - PullRequest
0 голосов
/ 24 сентября 2019

Я работаю с наборами данных babynames и пытаюсь выяснить, какие имена были самыми популярными, но проблема, с которой я сталкиваюсь, состоит в том, что одни и те же имена появляются более одного раза (потому что это топ-имена по годам), поэтому я хочу выяснить, как объединить одинаковые имена в одно, чтобы не сталкиваться с этой проблемой.

Это то, с чем я сейчас работаю (чтобы не испортить больший набор данных).

> baby.sub
# A tibble: 10 x 5
    year sex   name        n   prop
   <dbl> <chr> <chr>   <int>  <dbl>
 1  1947 F     Linda   99686 0.0548
 2  1948 F     Linda   96209 0.0552
 3  1947 M     James   94756 0.0510
 4  1957 M     Michael 92695 0.0424
 5  1947 M     Robert  91642 0.0493
 6  1949 F     Linda   91016 0.0518
 7  1956 M     Michael 90620 0.0423
 8  1958 M     Michael 90520 0.0420
 9  1948 M     James   88588 0.0497
10  1954 M     Michael 88514 0.0428

Я попытался сопоставить те же имена с этим:

baby.sub %>%
  str_match("[:alpha:]")

Я получил это:

> baby.sub %>%
+   str_match("[:alpha:]")
     [,1]
[1,] "c" 
[2,] "c" 
[3,] "c" 
[4,] "c" 
[5,] "c" 
Warning message:
In stri_match_first_regex(string, pattern, opts_regex = opts(pattern)) :
  argument is not an atomic vector; coercing

Эта строковая функция явно не та, которую я ищу.У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ:

Ответ на комментарий: @Roman, да, я забочусь только об именах и n (общее количество детей, названных этим именем), независимо отгод или пол.Вот что я пытаюсь получить из кода

> baby.sub
# A tibble: 10 x 5
    name       n  
    <chr>   <int> 
 1  Michael 362349
 2  Linda    286911
 3  James  183344
 4  Robert   91642
 5  James   88588

EDIT_2: решено!Спасибо!

baby.sub <- babynames %>%
  arrange(-n) %>%
  head(10)

baby.sub %>%
  group_by(name) %>%
  summarize(total.count = sum(n)) %>%
  arrange(-total.count)

name    total.count
  <chr>         <int>
1 Michael      362349
2 Linda        286911
3 James        183344
4 Robert        91642

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

Мне нравится использовать пакет data.table для таких вещей.

пример данных:

data <- data.table(name = c("Linda", "Linda", "James", "Michael", "James"),
                   n = c(313, 310, 301, 56, 530),
                   year = c(2012,2011, 2012, 2013, 2011))

код:

       data[, .(reps = .N, total.count = sum(n)), by = .(name)]

Output :
      name  reps total.count
1:   Linda     2 623
2:   James     2 831
3: Michael     1  56

Это может быть бесполезновам, но мне нравится, что это также дает количество раз, которое каждое имя возвращает.

1 голос
/ 24 сентября 2019

вы можете использовать group_by и суммировать для суммирования всех подсчетов по имени следующим образом:

library(tidyverse)
library(babynames)

babynames %>% 
  group_by(name) %>% 
  summarise(
  total_count = sum(n)
)
0 голосов
/ 24 сентября 2019

Мне кажется, я не до конца понимаю ваши проблемы, пожалуйста, подумайте над улучшением вопроса.Но вот что, я полагаю, вы пытаетесь достичь:

DataSummary <- baby.sub %>% 
                   group_by(name) %>% 
                   summarise(Total = sum(n)) %>%  #add na.rm = T if you have NULL values
                   arrange(desc(Total))  #So you get the data in order

Если вы хотите получить результат по годам, то:

 DataSummary <- baby.sub %>% 
                   group_by(name, year) %>% 
                   summarise(Total = sum(n))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...