event %>% select(6:27) %>% rowSums()
3 Réponses :
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
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
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
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()
Merci pour la solution. +1 pour expliquer le processus et montrer différentes méthodes pour le faire.
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
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 concernantDétecter l'ancien format grouped_df
, et une erreurColumn
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.