【问题标题】:Condense and join data frame压缩和连接数据框
【发布时间】:2020-10-12 21:49:38
【问题描述】:

我有一个数据框,我正试图与另一个数据框合并,我遇到了一些问题,我认为这些问题可以追溯到这样一个事实,即每次观察都是一个事件而不是累积量。我有下面的数据框,其中每一行都是一个单独的观察结果,然后我将使用weekcode 将其与基于相同变量weekcode 的另一个数据框合并。

数据框a 将每一行作为一个特定的观察值,但我需要它按代码/日期成为累积观察值/行。我完全被难住了。

  date       count       code  week
  <date>     <dbl>      <dbl> <dbl>
1 2020-06-07     4      13309    23
2 2020-06-07     5      13309    23
3 2020-07-12     6      18099    28
4 2020-07-12     8      18099    28

需要成为

  date       count       code  week
  <date>     <dbl>      <dbl> <dbl>
1 2020-06-07     9      13309    23
2 2020-07-12    14      18099    28

然后就可以和数据框b合并了

  date       color     name       code  week
  <date>     <char>   <char>      <dbl> <dbl>
1 2020-06-07 Blue         A      13309    23
1 2020-06-07 Yellow       B      13309    23
1 2020-06-07 Purple       D      13309    23
3 2020-07-12 Yellow       A      18099    28
3 2020-07-12 Blue         E      18099    28

最终结果将是

  date       color     name     code   week    count
  <date>     <char>   <char>   <dbl>  <dbl>    <dbl>
1 2020-06-07 Blue         A    13309     23        9
1 2020-06-07 Yellow       B    13309     23        9
1 2020-06-07 Purple       D    13309     23        9
3 2020-07-12 Yellow       A    18099     28       14
3 2020-07-12 Blue         E    18099     28       14

我最初使用下面的代码来执行此操作,但它完全炸毁了我的数据框。我的尺寸从dim(a) == (209807, 86) 变为dim(merged) == (1367029, 89)。我尝试了多种类型的连接(右连接、左连接、内连接等),但它们都仍然会破坏数据框(由大约 100 个左右的观察结果变化,但仍然导致超过一百万行)。这就是为什么我认为问题是由于a 是每个观察结果而不是特定日期特定代码的摘要观察结果。

merged <- right_join(x = b,
                     y = a, 
                     by = c("code" = "code",
                       "week" = "week"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    a %>%
      group_by(date, code, week) %>%
      summarize(count = sum(count)) %>%
      ungroup() %>%
      left_join(b, ., by = c("date", "code", "week"))
    #         date  color name  code week count
    # 1 2020-06-07   Blue    A 13309   23     9
    # 2 2020-06-07 Yellow    B 13309   23     9
    # 3 2020-06-07 Purple    D 13309   23     9
    # 4 2020-07-12 Yellow    A 18099   28    14
    # 5 2020-07-12   Blue    E 18099   28    14
    

    【讨论】:

      【解决方案2】:

      您对right_join() 的调用很接近,但在此之前,您应该做的第一件事是对第一个数据帧求和,以便获得计数的总和。您可以使用 summarize() 手动执行此操作,但更简单的方法是使用嵌套数据框并创建一个新列来汇总计数。

      如果您需要澄清,请告诉我?

      下次请以更容易复制和粘贴到 R 中的格式发布您的数据。

      library(tidyverse)
      
      dfA <- tribble(~date, ~count, ~code, ~week,
                     "2020-06-07",     4,      13309,    23,
                     "2020-06-07",     5,      13309,    23,
                     "2020-07-12",     6,      18099,    28,
                     "2020-07-12",     8,      18099,    28)
      
      dfB <- tribble(~date, ~color, ~name, ~code, ~week,
                     "2020-06-07", "Blue", "A", 13309, 23,
                     "2020-06-07", "Yellow", "B", 13309, 23,
                     "2020-06-07", "Purple", "D", 13309, 23,
                     "2020-07-12", "Yellow", "A", 18099, 28,
                     "2020-07-12", "Blue", "E", 18099, 28)
      
      total_counts <- dfA %>% 
        group_by(date, code, week) %>% 
        nest() %>% 
        mutate(count= map_dbl(data, sum)) %>% 
        select(date, count, code, week) %>% 
         right_join(dfB) %>% 
        select(date, color, name, code, week, count)
      #> Joining, by = c("date", "code", "week")
      
      total_counts
      
      #> # A tibble: 5 x 6
      #> # Groups:   date, code, week [2]
      #>   date       color  name   code  week count
      #>   <chr>      <chr>  <chr> <dbl> <dbl> <dbl>
      #> 1 2020-06-07 Blue   A     13309    23     9
      #> 2 2020-06-07 Yellow B     13309    23     9
      #> 3 2020-06-07 Purple D     13309    23     9
      #> 4 2020-07-12 Yellow A     18099    28    14
      #> 5 2020-07-12 Blue   E     18099    28    14
      

      reprex package (v0.3.0) 于 2020 年 10 月 12 日创建

      【讨论】:

        【解决方案3】:

        使用data.table 加入

        library(data.table)
        setDT(a)[, .(count = sum(count)), .(date, code, week)][b,
              on = .(date, code, week)]
        #         date  code week count  color name
        #1: 2020-06-07 13309   23     9   Blue    A
        #2: 2020-06-07 13309   23     9 Yellow    B
        #3: 2020-06-07 13309   23     9 Purple    D
        #4: 2020-07-12 18099   28    14 Yellow    A
        #5: 2020-07-12 18099   28    14   Blue    E
        

        【讨论】:

          猜你喜欢
          • 2020-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多