【问题标题】:How can I merge data with the same name within the same data set (perhaps with stringr)?如何在同一数据集中(可能使用 stringr)合并具有相同名称的数据?
【发布时间】:2019-09-24 14:48:14
【问题描述】:

我正在使用数据集 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

这个 stringr 函数显然不是我要找的那个。有人有什么想法吗?

编辑:

回复评论: @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

【问题讨论】:

  • 在上述情况下,@PedroGuizar 的预期结果是什么?
  • 如果您只关心名称而不关心其他数据,您可以试试unique(baby.sub$name)。但是,您正在尝试找出哪些名称最受欢迎。在哪一年?适合哪个性别? 总体?如果是,“总体”对您意味着什么?
  • 您的输出中是否需要nprop?如果不使用 unique 就像 Roman 说的那样,将返回一次所有不同的名称。如果你愿意,你也可以得到一个计数。
  • 我在上面的编辑中回复了我想要的结果。我会尝试 unique 和 group_by
  • @PedroGuizar 是否要将每个名称的所有 n 相加,因为 n 每年都不同?

标签: r


【解决方案1】:

您可以使用 group_by 并汇总每个名称的所有计数,如下所示:

library(tidyverse)
library(babynames)

babynames %>% 
  group_by(name) %>% 
  summarise(
  total_count = sum(n)
)

【讨论】:

    【解决方案2】:

    我喜欢将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
    

    这可能对您没有用,但我喜欢它还给出了每个名称返回的次数。

    【讨论】:

      【解决方案3】:

      我认为我不完全理解您的问题,请考虑改进问题。 然而,我相信您正在努力实现以下目标:

      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))
      

      【讨论】:

        猜你喜欢
        • 2023-02-24
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多