web-dev-qa-db-fra.com

Ajouter une ligne au bloc de données avec dplyr

J'ai ces exemples de données:

cvar <- c("2015-11-01","2015-11-02","All")
nvar1 <- c(12,10,5)
nvar2 <- c(7,5,6)
data <- cbind.data.frame(cvar,nvar1,nvar2)

Et je veux juste ajouter une nouvelle ligne au data.frame contenant les sommes de nvar1 et nvar2 et un caractère, donc avec la base R je voudrais simplement utiliser

data[nrow(data)+1,] <- c("add",sum(data[,2]),sum(data[,3]))

ou quelque chose de plus intelligent avec lapply, mais juste pour vous montrer ce que je recherche.

Je voudrais cette commande simple dans l'environnement de tuyau, donc les données%>% ... me donnent le résultat ci-dessus.

Appréciez toute aide, merci.

23
Sebastian

Quelque chose comme ça alors peut-être:

data %>% 
     rbind(c("add",sum(nvar1),sum(nvar2)))
#        cvar nvar1 nvar2
#1 2015-11-01    12     7
#2 2015-11-02    10     5
#3        All     5     6
#4        add    27    18

Modifier:

Selon votre commentaire, cela fonctionnera:

data %>% 
  mutate(nvar3 = nvar1) %>% 
  rbind(c("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 

En utilisant le . permettra à rbind de trouver nvar3

Edit2:

Fournissez la nouvelle ligne sous forme de liste et elle conservera les classes de colonnes:

> str(
+ data %>% 
+   mutate(nvar3 = nvar1) %>% 
+   rbind(list("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 
+ )
'data.frame':   4 obs. of  4 variables:
 $ cvar : chr  "2015-11-01" "2015-11-02" "All" "add"
 $ nvar1: num  12 10 5 27
 $ nvar2: num  7 5 6 18
 $ nvar3: num  12 10 5 27
15
LyzandeR

Avec tibble version 1.2, vous pouvez utiliser add_row()

https://blog.rstudio.org/2016/08/29/tibble-1-2-0/

data %>% 
 add_row(cvar = "add", nvar1 = sum(nvar1), nvar2 = sum(nvar2))
34
Rickard

En utilisant uniquement dplyr, vous pouvez effectuer les opérations suivantes

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data)

ce qui se traduit par

        cvar nvar1 nvar2
1        add    27    18
2 2015-11-01    12     7
3 2015-11-02    10     5
4        All     5     6

Notez que de cette façon, la nouvelle ligne est ajoutée au début plutôt qu'à la fin de la trame de données d'origine.

Si vous souhaitez plutôt ajouter la nouvelle ligne à la fin , utilisez le code suivant (merci à krlmlr pour l'avoir signalé )

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data, .)

ce qui se traduit par

        cvar nvar1 nvar2
1 2015-11-01    12     7
2 2015-11-02    10     5
3        All     5     6
4        add    27    18
12
Salim B