【问题标题】:add_row with group_by nest tibbleadd_row 与 group_by 嵌套小标题
【发布时间】:2018-01-20 04:42:18
【问题描述】:

我正在尝试将 add_row() 添加到分组数据中没有使用 do。

library(dplyr)
library(tidyr)
library(purrr)
library(tibble)


my.data <- data.frame(

  supplier = c("a","a","a","a","a","a","b","b","b","b","b","b"),
  date = rep(c("2017-06-01","2017-03-01","2017-02-01","2017-01-12",
               "2017-05-01","2017-04-01"), 2), 
  order = c(1,0,0,1,1,0,0,1,0,0,1,0)

)

解决方案

my.data %>%
  group_by(supplier) %>% 
  do(add_row(.,.before=0))

给了

# A tibble: 14 x 3
# Groups:   supplier [3]
   supplier       date order
      <chr>      <chr> <dbl>
 1     <NA>       <NA>    NA
 2        a 2017-06-01     1
 3        a 2017-03-01     0
 4        a 2017-02-01     0
 5        a 2017-01-12     1
 6        a 2017-05-01     1
 7        a 2017-04-01     0
 8     <NA>       <NA>    NA
 9        b 2017-06-01     0
10        b 2017-03-01     1
11        b 2017-02-01     0
12        b 2017-01-12     0
13        b 2017-05-01     1
14        b 2017-04-01     0

尝试使用嵌套和变异或 purrr::map

my.data %>%
  group_by(supplier) %>%
  nest() %>%
  mutate(extra.row = add_row(data, .before = 0))

mutate_impl(.data, dots) 中的错误: 评估错误:不支持的索引类型:NULL。

任何建议。缩放时做非常慢。

【问题讨论】:

  • 您希望整行都为 NA,甚至是分组变量?
  • 目的是添加日期值是每组最小日期前 30 天的日期值。 add_row(data, date = (min(.$date) - 30), .before=0)
  • 好吧,我猜应该加入。我不使用tidyverse,所以无法回答。您可能应该澄清问题中的“解决方案”不是解决方案(因为供应商和日期是 NA)..?

标签: r dplyr purrr tibble


【解决方案1】:

您可以使用bind_rows 将汇总数据集绑定到原始数​​据集。

您也可以使用complete,尽管现在每个组的日期是相同的,并且对于每个组的不同日期可能无法正常工作。此外,我相信complete 在您扩大规模时往往会变慢。

两种解决方案都取决于 date 是原始数据集中的实际 date 变量。

my.data = mutate(my.data, date = as.Date(date) )

总结和绑定summarizebind_rowsarrange 是为了让事情井井有条,在实际情况下很可能不需要。

my.data %>%
    group_by(supplier) %>%
    summarize(date = min(date) - 30) %>%
    bind_rows(., my.data) %>%  
    arrange(supplier, date)

如果组之间的日期相同,则使用 complete

my.data %>%
    group_by(supplier) %>%
    complete(date = c(min(.$date) - 30, .$date ) )

两者的结果:

# A tibble: 14 x 3
# Groups:   supplier [2]
   supplier       date order
     <fctr>     <date> <dbl>
 1        a 2016-12-13    NA
 2        a 2017-01-12     1
 3        a 2017-02-01     0
 4        a 2017-03-01     0
 5        a 2017-04-01     0
 6        a 2017-05-01     1
 7        a 2017-06-01     1
 8        b 2016-12-13    NA
 9        b 2017-01-12     0
10        b 2017-02-01     0
11        b 2017-03-01     1
12        b 2017-04-01     0
13        b 2017-05-01     1
14        b 2017-06-01     0

【讨论】:

  • 我喜欢 bind_rows() 答案。它可以满足我的需要。感谢您的帮助,非常感谢。
  • bind_rows 到原始数据集是解决各种问题的聪明方法,我敢肯定。总而言之,这是一个聪明的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多