2017-06-30 7 views
0

Problème: Je souhaite ajouter add_row en utilisant dplyr/tibble. Je veux regrouper les données par A dans mon exemple, puis add_row qui contient le nom de groupe A et ensuite une valeur pour B.Problèmes avec do add_row et group_by. Besoin du nom de variable group_by dans add_row

Le problème auquel je suis confronté consiste à ajouter la variable Group_by A dans la colonne sous A Peu importe ce que j'essaie, il revient toujours avec une erreur ou NA comme valeur dans cette colonne.

  1. exemple Reproductible:

    example <- data.frame(A = sample(letters[1:3],10,replace = TRUE), 
           B = sample(letters[24:26],10,replace = TRUE), 
           C = sample(1:3,10,replace = TRUE)) 
    
  2. sortie de l'exemple des données:

     A B C 
        1 c y 2 
        2 b x 3 
        3 c y 1 
        4 b y 1 
        5 c z 1 
        6 a x 1 
        7 b x 1 
        8 c z 2 
        9 a y 3 
        10 c y 1 
    
  3. code Je veux courir.

    answer <- example %>% 
        mutate(A = as.character(A), 
         B = as.character(B)) %>% 
        group_by(A) %>% 
        do(add_row(., 
          B = "ADDED", 
          C = "ADDED")) 
    
  4. sortie des données:

     A  B  C 
        1  a  x  1 
        2  a  y  3 
        3 <NA> ADDED ADDED 
        4  b  x  3 
        5  b  y  1 
        6  b  x  1 
        7 <NA> ADDED ADDED 
        8  c  y  2 
        9  c  y  1 
    10  c  z  1 
    11  c  z  2 
    12  c  y  1 
    13 <NA> ADDED ADDED 
    
  5. Ainsi, dans la sortie de données, où il y a NA je voudrais à-dire le nom du groupe (a, b, ou c)

J'ai essayé de mettre juste le nom de variable de groupe là, cela ne fonctionne pas jette une erreur.

Merci!

Répondre

3

Vous pouvez l'ajouter directement dans do.

example %>% 
    mutate_if(is.factor, as.character) %>% 
    group_by(A) %>% 
    do(add_row(., 
       A = unique(.$A), 
       B = "ADDED", 
       C = "ADDED")) 

Ou utilisez tidyr::fill à la fin. Parce qu'il remplit la variable de regroupement, vous devez d'abord ungroup.

library(tidyr) 

example %>% 
    mutate_if(is.factor, as.character) %>% 
    group_by(A) %>% 
    do(add_row(., 
       B = "ADDED", 
       C = "ADDED")) %>% 
    ungroup() %>% 
    fill(A) 

# A tibble: 13 x 3 
     A  B  C 
    <chr> <chr> <chr> 
1  a  z  2 
2  a  x  1 
3  a  y  2 
4  a ADDED ADDED 
5  b  y  1 
6  b  z  1 
7  b ADDED ADDED 
8  c  z  2 
9  c  y  2 
10  c  z  2 
11  c  y  2 
12  c  z  1 
13  c ADDED ADDED 
+0

aosmith, Votre deuxième réponse a travaillé pour le vrai jeu de données/problème que j'avais. Lorsque j'ai utilisé le. $ A pour mon jeu de données réel, il a créé 2 copies de l'add_row. Je ne sais pas pourquoi cela n'a pas fonctionné, cependant, la deuxième solution que vous avez fournie fonctionnait très bien. Merci pour l'aide! Je dois apprendre à remplir() –

+0

@MattD J'ai oublié 'unique' dans la première option, cela devrait fonctionner mieux maintenant. – aosmith

0
library(zoo) 

df=read.table(text='A  B  C 
       1  a  x  1 
       2  a  y  3 
       3 NA ADDED ADDED 
       4  b  x  3 
       5  b  y  1 
       6  b  x  1 
       7 NA ADDED ADDED 
       8  c  y  2 
       9  c  y  1 
       10  c  z  1 
       11  c  z  2 
       12  c  y  1 
       13 NA ADDED ADDED',header=TRUE,stringsAsFactors=FALSE) 

df$A=na.locf(df$A) 

> df 
    A  B  C 
1 a  x  1 
2 a  y  3 
3 a ADDED ADDED 
4 b  x  3 
5 b  y  1 
6 b  x  1 
7 b ADDED ADDED 
8 c  y  2 
9 c  y  1 
10 c  z  1 
11 c  z  2 
12 c  y  1 
13 c ADDED ADDED 
0
library(tidyverse) 

example <- tibble(A = sample(letters[1:3], 10, replace = TRUE), 
        B = sample(letters[24:26], 10, replace = TRUE), 
        C = sample(1:3, 10, replace = TRUE)) %>% 
    mutate(C = as.character(C)) %>% 
    arrange(A) 

to_be_added <- example %>% distinct(A) %>% cbind(B = "ADDED", C = "ADDED") 

bind_rows(example, to_be_added) %>% arrange(A) 
#> # A tibble: 13 x 3 
#>  A  B  C 
#> <chr> <chr> <chr> 
#> 1  a  z  2 
#> 2  a  y  1 
#> 3  a ADDED ADDED 
#> 4  b  x  1 
#> 5  b  z  1 
#> 6  b  z  1 
#> 7  b  y  3 
#> 8  b  y  1 
#> 9  b  y  1 
#> 10  b ADDED ADDED 
#> 11  c  y  1 
#> 12  c  z  1 
#> 13  c ADDED ADDED