add_row 与 group_by 巢穴
add_row with group_by nest tibble
我正在尝试 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.
任何建议。 do 缩放时非常慢。
您可以使用 bind_rows
将汇总数据集绑定到原始数据集。
您也可以使用 complete
,尽管现在每个组的日期是相同的,并且它可能无法像为每个组的不同日期编写的那样工作。另外,我相信 complete
扩展时往往会很慢。
两种解决方案都取决于 date
是原始数据集中的实际 date
变量。
my.data = mutate(my.data, date = as.Date(date) )
总结和绑定 summarize
和 bind_rows
。 arrange
是为了让事情井井有条,在实际情况下很可能不需要。
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
我正在尝试 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.
任何建议。 do 缩放时非常慢。
您可以使用 bind_rows
将汇总数据集绑定到原始数据集。
您也可以使用 complete
,尽管现在每个组的日期是相同的,并且它可能无法像为每个组的不同日期编写的那样工作。另外,我相信 complete
扩展时往往会很慢。
两种解决方案都取决于 date
是原始数据集中的实际 date
变量。
my.data = mutate(my.data, date = as.Date(date) )
总结和绑定 summarize
和 bind_rows
。 arrange
是为了让事情井井有条,在实际情况下很可能不需要。
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