2017-08-11 1 views
0

J'essaie d'ajouter add() aux données groupées sans en utilisant do.add_row avec group_by imbriqué

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) 

) 

Solution avec faire

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

qui donne

# 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 

tentative avec nid et muter ou purrr :: carte

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

Erreur dans mutate_impl (.data, dots): Erreur d'évaluation: Type d'index non pris en charge: NULL.

Toutes les suggestions. faire est très lent lorsqu'il est mis à l'échelle.

+0

Vous voulez la ligne entière soit NA, même le regroupement var (s)? – Frank

+0

L'objectif est d'ajouter add_row avec la valeur de date qui est 30 jours avant la date minimale par groupe. add_row (données, date = (min (. $ date) - 30), .before = 0) – iboboboru

+0

Ok, une jointure devrait le faire, je suppose. Je n'utilise pas le tidyverse donc je ne peux pas répondre. Vous devriez probablement préciser que la "solution à faire" dans la question n'est pas une solution (puisque le fournisseur et la date sont NA) ..? – Frank

Répondre

2

Vous pouvez lier un ensemble de données résumé sur l'original assez facilement. Vous pouvez également utiliser complete, mais vos dates par groupe sont les mêmes et il se peut que cela ne fonctionne pas comme prévu pour différentes dates par groupe. En outre, je crois que complete a tendance à être lent lorsque vous augmentez.

Les deux solutions reposent sur date étant une variable réelle date dans l'ensemble de données d'origine.

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

Résumer et la liaison avec summarize et bind_rows. Le arrange est de mettre les choses en ordre, et pourrait très bien ne pas être nécessaire dans le cas réel.

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

En utilisant si les dates sont identiques dans les groupes.

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

Résultat pour les deux:

# 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

J'aime la réponse de bind_rows(). Cela fonctionnera pour ce dont j'ai besoin. Merci pour l'aide, très appréciée. – iboboboru