2017-09-18 2 views
0

Je réutilise une réponse à la question de quelqu'un d'autre, mais quelqu'un pourrait-il me dire si l'approche ci-dessous peut être utilisée pour répondre à plusieurs conditions avant de faire le changement?Tuyau bidirectionnel Magrittr et conditions multiples?

library(dplyr) 
library(magrittr) 

df[df$tag=="ggyg",] %<>% mutate(tag="xxx") 

J'ai essayé mais cela ne fonctionne pas.

df[df$tag=="ggyg",] %<>% df[df$h.tank==2,] %<>% mutate(tag="xxx") 

Je suis en train d'utiliser l'approche ci-dessus car il permettrait d'économiser beaucoup de temps au lieu d'utiliser des déclarations IfElse pour répondre aux conditions.

Merci!

+0

Quand vous dites ça ne marche pas, quoi arrive au lieu de ce que vous voulez? Recevez-vous un avertissement concernant les niveaux de facteur non valides, par exemple? –

+1

Avez-vous essayé 'df [df $ tag ==" ggyg "& df $ h.tank == 2,]'? –

+0

C'est génial! Semble faire exactement ce que je voulais, rencontrer plusieurs conditions et ensuite changer la ligne pour quelque chose que je veux. Merci! – Dasr

Répondre

1

Au lieu de charger des conditions dans différentes clauses, pourquoi ne pas combiner vos conditions en une seule déclaration?

df[df$tag=="ggyg" & df$h.tank==2,] %<>% mutate(tag="xxx") 

Ou un peu plus idiomatiques:

df %<>% mutate(tag = ifelse(tag == "ggyg" & h.tank == 2, "xxx", tag)) 
2

Voici 2 pures magrittr/dplyr solutions:

df %<>% inset(tag == "ggyg" & h.tank == 2,"tag","xxx")    # pure magrittr 
df %<>% mutate(tag = inset(tag,tag == "ggyg" & h.tank == 2, "xxx")) # magrittr & dplyr 

et quelques exemples reproductibles:

cars2 <- head(cars) 
# speed dist 
# 1  4 2 
# 2  4 10 
# 3  7 4 
# 4  7 22 
# 5  8 16 
# 6  9 10 

cars2 %<>% inset(.$dist==4,"speed",value=1000) 
cars2 %<>% mutate(speed = inset(speed,dist==22,2000)) 

# speed dist 
# 1  4 2 
# 2  4 10 
# 3 1000 4 
# 4 2000 22 
# 5  8 16 
# 6  9 10