2017-03-02 2 views
1

J'ai un ensemble de données comme suit:intégré Déclaration IfElse

Source  Rev_Diff Cost_Diff  Price_Diff  Sales_Diff  
    A   -10   10    11    12 
    B   11   -10   -10    11 
    C   -12   10    10    -11 
    D   -11   -11   -10    -12 

Comment ajouter une colonne où:

« Si Rev_Diff est inférieure à 0, print "coût" si "Cost_Diff" avec le montant est inférieur à 0, imprimer "Prix" si "Price_Diff" avec le montant est inférieur à 0, imprimer "Ventes" si "Sales_Diff" avec le montant est inférieur à 0, sinon imprimer "We are up"

Sortie finale:

Source  Rev_Diff Cost_Diff  Price_Diff  Sales_Diff  Reason Down  
    A   -10   -10    11    12  Cost (-10) 
    B   11   -10   -10    11  We're Up 
    C   -12   10    10    -11  Sales (-11) 
    D   -11   -11   -10    -12  Cost (-11), Price (-11), Sales (-12) 
+0

Peut-être utiliser 'max.col' et la prochaine fois envisager de faire un exemple moins compliqué (comme, ne pas avoir le point « rev » à « coût », etc.) – Frank

Répondre

1

Je ne pouvais pas tout à fait obtenir votre façon dont vous voulez structurer vos déclarations, mais si les éléments suivants peuvent ajouter une nouvelle colonne sur la base d'informations dans une colonne précédente.

Source <- c("A", "B", "C", "D", "E") 
Rev_Diff <- c(-10, 11, 12, 11, 10) 
Cost_Diff <- c(10, -10, 10, -11, 11) 
Price_Diff <- c(-11, 10, -10, 10, 10) 
Sales_Diff <- c(12, 11, 11, -12, 11) 

df <- data.frame(Source, Rev_Diff, Cost_Diff, Price_Diff, Sales_Diff) 

df %>% 
    mutate(ReasonDown = ifelse(Rev_Diff < 0, paste("Rev", Rev_Diff), 
         ifelse(Cost_Diff < 0, paste("Cost", Cost_Diff), 
         ifelse(Price_Diff < 0, paste("Price", Price_Diff), 
         ifelse(Sales_Diff < 0, paste("Sales", Sales_Diff), "We're up"))))) 

    Source Rev_Diff Cost_Diff Price_Diff Sales_Diff ReasonDown 
1  A  -10  10  -11   12 Rev -10 
2  B  11  -10   10   11 Cost -10 
3  C  12  10  -10   11 Price -10 
4  D  11  -11   10  -12 Cost -11 
5  E  10  11   10   11 We're up 

Cependant, ifelse s'arrêtera une fois qu'il trouve une déclaration TRUE, donc ce ne sera pas en mesure d'imprimer plusieurs « Raisons vers le bas » comme vous aviez dans la source D. Si vous voulez vraiment imprimer tout, je pense vous devriez être en mesure d'ajouter 4 nouvelles colonnes pour vérifier chaque Rev, Coût, Prix, Ventes, et ajouter une 5ème colonne pour tout résumer.

df %>% 
    mutate(RRev = ifelse(Rev_Diff < 0, paste("Rev", Rev_Diff), "")) %>% 
    mutate(RCost = ifelse(Cost_Diff < 0, paste("Cost", Cost_Diff), "")) %>% 
    mutate(RPrice = ifelse(Price_Diff < 0, paste("Price", Rev_Diff), "")) %>% 
    mutate(RSales = ifelse(Sales_Diff < 0, paste("Sales", Rev_Diff), "")) %>% 
    mutate(DownReason = ifelse(nchar(paste(RRev, RCost, RPrice, RSales)) > 3, paste(RRev, RCost, RPrice, RSales), "We're UP")) 

    Source Rev_Diff Cost_Diff Price_Diff Sales_Diff RRev RCost RPrice RSales   DownReason 
1  A  -10  10  -11   12 Rev -10   Price -10   Rev -10 Price -10 
2  B  11  -10   10   11   Cost -10        Cost -10 
3  C  12  10  -10   11     Price 12     Price 12 
4  D  11  -11   10  -12   Cost -11   Sales 11 Cost -11 Sales 11 
5  E  10  11   10   11            We're UP 
+0

Merci @JPHwang, comment voulez-vous ajouter le" We're Up "section pour la dernière version? –

+0

Vous pouvez utiliser un seul 'mutate' pour ajouter plusieurs colonnes. – Gregor

+0

@NickKnauer a changé la dernière déclaration pour compter le nombre de caractères, si tout est> 0, la pâte va générer 3 blancs, donc tout ce qui précède imprimera comme d'habitude et 3 blancs génèrent "We are up" – JPHwang