Somme sur plusieurs colonnes avec dplyr

Ma question consiste à additionner des valeurs sur plusieurs colonnes d’un dplyr de données et à créer une nouvelle colonne correspondant à cette sum en utilisant dplyr . Les entrées de données dans les colonnes sont binarys (0,1). Je pense à un analogue en ligne par mutate_each fonction mutate_each ou mutate_each de dplyr . Voici un exemple minimal du bloc de données:

 library(dplyr) df=data.frame( x1=c(1,0,0,NA,0,1,1,NA,0,1), x2=c(1,1,NA,1,1,0,NA,NA,0,1), x3=c(0,1,0,1,1,0,NA,NA,0,1), x4=c(1,0,NA,1,0,0,NA,0,0,1), x5=c(1,1,NA,1,1,1,NA,1,0,1)) > df x1 x2 x3 x4 x5 1 1 1 0 1 1 2 0 1 1 0 1 3 0 NA 0 NA NA 4 NA 1 1 1 1 5 0 1 1 0 1 6 1 0 0 0 1 7 1 NA NA NA NA 8 NA NA NA 0 1 9 0 0 0 0 0 10 1 1 1 1 1 

Je pourrais utiliser quelque chose comme:

 df % mutate(sumrow= x1 + x2 + x3 + x4 + x5) 

mais cela impliquerait d’écrire les noms de chacune des colonnes. J’ai comme 50 colonnes. De plus, les noms de colonnes changent à différentes itérations de la boucle dans laquelle je souhaite implémenter cette opération. Je voudrais donc éviter de devoir donner des noms de colonne.

Comment puis-je le faire le plus efficacement possible? Toute assistance sera grandement appréciée.

Que diriez-vous

résumer chaque colonne

 df %>% replace(is.na(.), 0) %>% summarise_all(funs(sum)) 

résumer chaque ligne

 df %>% replace(is.na(.), 0) %>% mutate(sum = rowSums(.[1:5])) 

J’utiliserais la correspondance d’expressions régulières pour résumer les variables avec certains noms de modèle. Par exemple:

 df <- df %>% mutate(sum1 = rowSums(.[grep("x[3-5]", names(.))], na.rm = TRUE), sum_all = rowSums(.[grep("x", names(.))], na.rm = TRUE)) 

De cette façon, vous pouvez créer plusieurs variables en tant que sum de certains groupes de variables de votre bloc de données.

Si vous voulez seulement faire la sum de certaines colonnes, j’utiliserais quelque chose comme ceci:

 library(dplyr) df=data.frame( x1=c(1,0,0,NA,0,1,1,NA,0,1), x2=c(1,1,NA,1,1,0,NA,NA,0,1), x3=c(0,1,0,1,1,0,NA,NA,0,1), x4=c(1,0,NA,1,0,0,NA,0,0,1), x5=c(1,1,NA,1,1,1,NA,1,0,1)) df %>% select(x3:x5) %>% rowSums(na.rm=TRUE) -> df$x3x5.total head(df) 

De cette façon, vous pouvez utiliser la dplyr::select .

Je rencontre souvent ce problème, et le moyen le plus simple consiste à utiliser la fonction apply() dans une commande mutate .

 library(tidyverse) df=data.frame( x1=c(1,0,0,NA,0,1,1,NA,0,1), x2=c(1,1,NA,1,1,0,NA,NA,0,1), x3=c(0,1,0,1,1,0,NA,NA,0,1), x4=c(1,0,NA,1,0,0,NA,0,0,1), x5=c(1,1,NA,1,1,1,NA,1,0,1)) df %>% mutate(sum = select(., x1:x5) %>% apply(1, sum, na.rm=TRUE)) 

Vous pouvez utiliser ici tout ce que vous voulez pour sélectionner les colonnes en utilisant les astuces standard de dplyr (par exemple starts_with() ou contains() ). En effectuant tout le travail dans une seule commande dplyr , cette action peut se produire n’importe où dans un stream dplyr d’étapes de traitement. Enfin, en utilisant la fonction apply() , vous pouvez utiliser le résumé dont vous avez besoin, y compris votre propre fonction de synthèse.

Alternativement, si l’idée d’utiliser une fonction non-tidyverse est peu attrayante, vous pouvez rassembler les colonnes, les résumer et finalement joindre le résultat au bloc de données d’origine.

 df <- df %>% mutate( id = 1:n() ) # Need some ID column for this to work df <- df %>% group_by(id) %>% gather('Key', 'value', starts_with('x')) %>% summarise( Key.Sum = sum(value) ) %>% left_join( df, . ) 

Ici, j’ai utilisé la fonction starts_with() pour sélectionner les colonnes et calculer la sum et vous pouvez faire ce que vous voulez avec les valeurs NA . L’inconvénient de cette approche est que même si elle est assez flexible, elle ne s’intègre pas vraiment dans un stream de étapes de nettoyage des données.