2017-08-11 57 views
0

我想add_row()分組數據沒有使用做。add_row與group_by巢弼

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 ::地圖

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

mutate_impl(.data,dots)中的錯誤: 評估錯誤:不支持的索引類型:NULL。

有任何建議。縮放時,速度非常慢。

+0

你想整行是NA,甚至分組VAR(S)? – Frank

+0

意圖是add_row的日期值是每組最短日期之前的30天。 add_row(數據,日期=(分鐘(。$日期) - 30),.before = 0) – iboboboru

+0

好吧,加入應該這樣做,我猜。我不使用全反,所以不能作出答案。您應該澄清一下,問題中的「帶解決方案」不是解決方案(因爲供應商和日期不適用)。? – Frank

回答

2

您可以很容易地將彙總數據集綁定到原始數​​據集上。您也可以使用complete,但現在每個組的日期都是相同的,並且可能不適用於每個組的不同日期。另外,我認爲complete在放大時趨於緩慢。

這兩種解決方案都取決於date是原始數據集中的實際date變量。

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

總結,並與summarizebind_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 
+0

我喜歡bind_rows()的答案。它會爲我所需要的工作。感謝您的幫助,非常感謝。 – iboboboru