2015-10-15 1 views
2

Je travaille sur les données des réclamations qui ressemble le format ci-dessous: -R - Comment intégrer s'il y en a dans dplyr?

claim mem_number year_month label 
1  123   2011-Jan Clinic 
2  123   2011-Jan Lab 
3  123   2011-Jan Office 
4  234   2011-Jan office 
5  234   2012-Feb Lab 

Je voudrais groupe par mem_number et year_month et secrètes toutes ces étiquettes aux cliniques, même si une seule étiquette dans ce groupe est clinique. la sortie doit être: -

Claim mem_number year_month label 
1  123   2011-Jan Clinic 
2  123   2011-Jan Clinic 
3  123   2011-Jan Clinic 
4  234   2011-Jan Office 
5  234   2012-Feb Lab 

Mon approche de ce problème est le suivant: -

library("dplyr") 

output<-input %>% group_by(mem_number,year_month) %>% 
     mutate(label=if(any(label=="Clinic","Clinic",NA))) 

its me donnant des erreurs. J'aimerais connaître mon erreur et comment la résoudre.

+1

Peut-être que vous vouliez dire 'if (any (label == "Clinic")) "Clinic" else NA' ou peut-être que vous vouliez 'ifelse()' –

+1

Comme Richard l'a dit, vous n'avez pas fermé les parenthèses les 'si 'ceux au bon endroit. Et vous avez utilisé la syntaxe 'ifelse' sur un' if' et 'else' - qui sont des fonctions différentes. Essayez quelque chose comme 'mutate (label = ifelse (any (label ==" Clinique ")," Clinic ", as.character (label)))' –

+0

@DavidArenburg Essayé votre code! Ça marche. Merci – x1carbon

Répondre

2

J'utiliser data.table:

library(data.table) 
setDT(DT) 

bad_rows <- DT[, 
    if (any(label=="Clinic")) .I[label != "Clinic"] 
, by=.(mem_number,year_month)]$V1 

DT[ bad_rows, label := "Clinic" ] 

ou

bad_groups <- DT[, 
    if (any(label=="Clinic")) 1 
, by=.(mem_number,year_month)][, V1 := NULL] 

DT[ bad_groups, label := "Clinic", on=c("mem_number", "year_month")] 

Commentaire. Je pense que ce serait plus clair si nous pouvions écrire

# pseudocode -- DOES NOT WORK 
DT[, 
    label[label != "Clinic"] := "Clinic" 
, by=.(mem_number, year_month), having = any(label=="Clinic")] 

mais des demandes pour ce sont encore ouvertes.

+0

@ x1carbon Oh, viens de remarquer que vous avez demandé dplyr dans le titre. Faites-moi savoir si ce n'est pas ce que vous cherchez, et s'il vous plaît la prochaine fois n'oubliez pas de l'ajouter à vos tags. – Frank

+0

Merci @Frank. Plus de méthodologies sont toujours les bienvenues. Appréciez-le. – x1carbon

3

En utilisant data.table, je ferais comme ceci:

require(data.table) # v1.9.6+ 
dt[dt[label == "Clinic"], label := "Clinic", on="mem_number"] 

On extrait les lignes où label == "Clinic". Cela nous permet d'utiliser mem_number correspondant à ces lignes. Et nous effectuons une jointure sur ces lignes sur dt, et pour chaque ligne correspondante, nous mettons à jour label avec la valeur "Clinic". Comme le souligne @Frank, si vous souhaitez que la jointure soit à la place sur mem_number et year_month, utilisez on=c("mem_number", "year_month"). Je ne pensais pas que c'était nécessaire pour l'exemple que vous avez montré.

+0

Je reçois cette erreur - 'Erreur dans '[.data.frame' (dt, dt [étiquette ==" INPATIENT_SURGERY "],': = '(étiquette,: argument non utilisé (on = c (" MEM_NUMBER "," Year_Month ")) ' – x1carbon

+0

Curieux, il y a un attribut' index' dans le résultat Qu'est-ce que c'est? Index = integer (0) 'dans' dput() 'et' $ index' dans les attributs. –

+0

Richard, auto indexant la colonne 'label' en raison de' == "Clinic" '. – Arun