1
votes

Comment faire muter une colonne à l'aide de dplyr avec une valeur lorsque l'une des colonnes contient un 1 sinon 0

event %>% select(6:27) %>% rowSums()

3 commentaires

events $ newcol <- select (events, matches ("In Hospital"))%>% rowSums () a fonctionné pour moi (une fois que j'ai corrigé les erreurs mentionnées dans mon prochain commentaire).


BTW, vos données sont regroupées, ce qui peut ralentir certaines opérations centrées sur dplyr . De plus, j'ai reçu un avertissement concernant Détecter l'ancien format grouped_df , et une erreur Column NCDRPatientID` est inconnue , suggérant plusieurs autres choses qui ne rendent pas cela complètement -reproductible. Donc, ma solution commentée peut ne pas fonctionner si votre version de dplyr` est significativement plus ancienne que la mienne (0.8.0.1).


@ r2evans, merci de l'avoir signalé. Je pense que j'ai fait une erreur en copiant et collant les données et en supprimant accidentellement la colonne patient NCDR. Mais cela fonctionne toujours.


3 Réponses :


2
votes

Ce n'est pas une méthode de déploiement, mais cela fonctionne aussi:

events$new_col <- 0
events$new_col[rowSums(events[, grep("In Hospital", colnames(events))]) >= 1] <- 1


0 commentaires

2
votes

Avant de développer ma solution, j'ai exécuté le code suivant pour dissocier vos données.

events2 <- events %>% mutate(Col = apply(select(., ends_with("(In Hospital)")), 1, max))
events2$Col 
# [1] 1 1 1 1 1

Solution 1: rowSums avec des colonnes sélectionnées

L'idée de cette solution est pour utiliser rowSums pour ajouter tous les nombres des colonnes sélectionnées, déterminer si la somme est supérieure à 0, puis convertir le vecteur logique en vecteur entier (avec 1 ou 0).

Il existe de nombreuses façons de sélectionner les colonnes. Nous pouvons sélectionner en fonction des numéros de colonne.

events2 <- events %>% mutate(Col = as.integer(rowSums(select(., contains("(In Hospital)"))) > 0))
events2$Col 
# [1] 1 1 1 1 1

Nous pouvons utiliser ends_with.

events2 <- events %>% mutate(Col = as.integer(rowSums(select(., matches("\\(In Hospital\\)$"))) > 0))
events2$Col 
# [1] 1 1 1 1 1

Nous pouvons utiliser des matches . L'expression régulière \\ (In Hospital \\) $ indique la chaîne à la fin.

events2 <- events %>% mutate(Col = as.integer(rowSums(select(., ends_with("(In Hospital)"))) > 0))
events2$Col 
# [1] 1 1 1 1 1

On peut utiliser contains code>, mais notez que la chaîne cible n'a pas besoin d'être à la fin des noms de colonne.

events2 <- events %>% mutate(Col = as.integer(rowSums(select(., 6:27)) > 0))
events2$Col 
# [1] 1 1 1 1 1

Solution 2: appliquer avec max

Puisque les nombres des colonnes cibles sont tous 1 ou 0 , nous pouvons utiliser apply avec max pour obtenir le maximum, qui sera 1 s'il y a un 1 , ou 0 . Toutes les façons d'utiliser la fonction select comme indiqué ci-dessus fonctionneront également ici. Ci-dessous, j'ai présenté une façon de le faire.

library(dplyr)

events <- events %>% ungroup()


1 commentaires

Merci pour la solution. +1 pour expliquer le processus et montrer différentes méthodes pour le faire.



2
votes

Une solution de la base R utilisant apply()

cols <- grep("in hospital", colnames(events), ignore.case = T)
apply(events[, cols], 1, function(x) ifelse(any(x == 1), 1, 0))

# [1] 1 1 1 1 1


0 commentaires