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 erreurColumnNCDRPatientID` 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 dedplyr` 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.